From 3d7361827042eb45493e16f1e3f78ecae3c84541 Mon Sep 17 00:00:00 2001 From: Developer Date: Tue, 16 Jun 2026 14:04:53 +0800 Subject: [PATCH] =?UTF-8?q?chore:=20=E6=B8=85=E7=90=86=E6=A0=B9=E7=9B=AE?= =?UTF-8?q?=E5=BD=95=E5=86=97=E4=BD=99=E6=96=87=E4=BB=B6=EF=BC=88=E7=BF=BB?= =?UTF-8?q?=E8=AF=91=E5=B7=A5=E5=85=B7/=E6=97=A7=E8=84=9A=E6=9C=AC/?= =?UTF-8?q?=E8=B0=83=E8=AF=95=E6=96=87=E4=BB=B6/=E6=88=AA=E5=9B=BE?= =?UTF-8?q?=E7=AD=89=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 删除约50个文件: - 翻译/i18n工具 21个(cjk_*、extract_*、apply_*等) - 部署脚本 3个(build_and_push、deploy) - 诊断调试文件 15个(check_*、query_*、db_output等) - 旧截图 1个 - 杂项配置文件 3个(.antigravityrules .cursorrules tm_schema.txt) Co-Authored-By: Claude Opus 4.8 --- .antigravityrules | 26 - .cursorrules | 13 - all_used_keys.txt | 521 --- apply_cjk_translations.js | 337 -- apply_cjk_translations.py | 332 -- apply_translations.js | 43 - auto_dict.json | 133 - auto_replace.js | 60 - auto_translator.js | 52 - backend_cjk.txt | 404 -- build_and_push.bat | 49 - build_and_push.sh | 38 - check_all_dbs.js | 17 - check_schema.js | 14 - cjk_extract.json | 7250 ----------------------------------- cjk_files.txt | 50 - clean_translations.js | 184 - clean_translations.py | 87 - deploy.sh | 43 - extract_cjk.js | 45 - extract_cjk.py | 31 - extract_keys.js | 37 - extract_logs.js | 37 - extract_strings.js | 29 - files_to_translate.json | 4 - final_cleanup.js | 89 - final_fix_braces.js | 26 - fix_empty_translations.js | 21 - fix_kb_service.py | 74 - identifier.sqlite | 0 lint_output.txt | Bin 1510 -> 0 bytes log_dups.txt | 1551 -------- package.json | 1 + query_columns.js | 11 - query_db.js | 16 - remaining_4.txt | 4 - remaining_cjk.txt | Bin 81072 -> 0 bytes schema.txt | 1 - server/package.json | 2 +- server/tsconfig.tsbuildinfo | 2 +- sync_translations.js | 80 - test-feishu-assessment.js | 42 - test-graph.js | 41 - test-systematic.mjs | 4 +- test_admin_features.md | 32 - tm_schema.txt | 1 - tmp_duplicates.txt | 2090 ---------- translation_map.json | 4 - true_code.txt | 265 -- 49 files changed, 5 insertions(+), 14188 deletions(-) delete mode 100644 .antigravityrules delete mode 100644 .cursorrules delete mode 100644 all_used_keys.txt delete mode 100644 apply_cjk_translations.js delete mode 100644 apply_cjk_translations.py delete mode 100644 apply_translations.js delete mode 100644 auto_dict.json delete mode 100644 auto_replace.js delete mode 100644 auto_translator.js delete mode 100644 backend_cjk.txt delete mode 100644 build_and_push.bat delete mode 100644 build_and_push.sh delete mode 100644 check_all_dbs.js delete mode 100644 check_schema.js delete mode 100644 cjk_extract.json delete mode 100644 cjk_files.txt delete mode 100644 clean_translations.js delete mode 100644 clean_translations.py delete mode 100644 deploy.sh delete mode 100644 extract_cjk.js delete mode 100644 extract_cjk.py delete mode 100644 extract_keys.js delete mode 100644 extract_logs.js delete mode 100644 extract_strings.js delete mode 100644 files_to_translate.json delete mode 100644 final_cleanup.js delete mode 100644 final_fix_braces.js delete mode 100644 fix_empty_translations.js delete mode 100644 fix_kb_service.py delete mode 100644 identifier.sqlite delete mode 100644 lint_output.txt delete mode 100644 log_dups.txt delete mode 100644 query_columns.js delete mode 100644 query_db.js delete mode 100644 remaining_4.txt delete mode 100644 remaining_cjk.txt delete mode 100644 schema.txt delete mode 100644 sync_translations.js delete mode 100644 test-feishu-assessment.js delete mode 100644 test-graph.js delete mode 100644 test_admin_features.md delete mode 100644 tm_schema.txt delete mode 100644 tmp_duplicates.txt delete mode 100644 translation_map.json delete mode 100644 true_code.txt diff --git a/.antigravityrules b/.antigravityrules deleted file mode 100644 index 24b399e..0000000 --- a/.antigravityrules +++ /dev/null @@ -1,26 +0,0 @@ -# Global Project Constraints - -1. **Language Requirements**: - - All code comments **MUST** be written in **English**. - - All server and client logs (`console.log`, `logger.info`, `logger.error`, etc.) **MUST** be written in **English**. - -2. **Internationalization (i18n)**: - - All user-facing messages, API response messages, error messages, and UI text **MUST** guarantee internationalization support. - - Do not use hardcoded string literals for messages. Always use the project's designated i18n service or translation utility with proper keys. - -3. **UI Notifications**: - - All popup messages, error alerts, and system notifications **MUST** uniformly use the toast component (e.g., via `useToast().showError()`, `showSuccess()`). - - Never use native browser `window.alert()`. - -4. **Agent Architecture & Orchestration (v3.0)**: - - High-complexity, multi-turn AI workflows (e.g., AI Tutor, Evaluation Agents) **MUST** use `LangGraph` for state machine orchestration. Do not rely on hardcoded linear `if-else` blocks or flat chains for multi-step agent interactions. - - Separate distinct AI responsibilities (e.g., `QuestionGenerator`, `Grader`, `ReportAnalyzer`) into independent **Graph Nodes**. - - Use **Conditional Edges (Routing)** to dynamically control the flow based on the graph state (e.g., triggering follow-up questions vs. proceeding to the next question). - - The graph must maintain a central `State` object (e.g., `EvaluationState`) to track session data, current progress, multi-turn dialogue history, and interruption/recovery points (Thread IDs). - -5. **Agent Evaluation & Anti-Hallucination**: - - When using an LLM to grade or evaluate user input against a knowledge base, the Agent's System Prompt **MUST** always include the original reference documents (Ground Truth Chunks) to strictly prevent AI hallucination during scoring. - -6. **Knowledge Graph Integration**: - - When extracting complex relationships from documents for GraphRAG, ensure the LLM output conforms strictly to predefined schemas (Ontology) to prevent graph pollution. - - Heavy extraction tasks (like Full Document Entity/Relation Extraction) must be handled asynchronously as background tasks, rather than blocking synchronous API calls. diff --git a/.cursorrules b/.cursorrules deleted file mode 100644 index 0bebd50..0000000 --- a/.cursorrules +++ /dev/null @@ -1,13 +0,0 @@ -# Global Project Constraints - -1. **Language Requirements**: - - All code comments **MUST** be written in **English**. - - All server and client logs (`console.log`, `logger.info`, `logger.error`, etc.) **MUST** be written in **English**. - -2. **Internationalization (i18n)**: - - All user-facing messages, API response messages, error messages, and UI text **MUST** guarantee internationalization support. - - Do not use hardcoded string literals for messages. Always use the project's designated i18n service or translation utility with proper keys. - -3. **UI Notifications**: - - All popup messages, error alerts, and system notifications **MUST** uniformly use the toast component (e.g., via `useToast().showError()`, `showSuccess()`). - - Never use native browser `window.alert()`. diff --git a/all_used_keys.txt b/all_used_keys.txt deleted file mode 100644 index 29b01d7..0000000 --- a/all_used_keys.txt +++ /dev/null @@ -1,521 +0,0 @@ -2d -Authorization -a -actionFailed -actions -addFile -addUser -admin -agentDesc -agentTitle -aiAssistant -aiCommandsApplyResult -aiCommandsCustom -aiCommandsCustomPlaceholder -aiCommandsError -aiCommandsGenerating -aiCommandsGoBack -aiCommandsModalApply -aiCommandsModalBasedOnSelection -aiCommandsModalCustom -aiCommandsModalCustomPlaceholder -aiCommandsModalPreset -aiCommandsModalResult -aiCommandsPreset -aiCommandsReferenceContext -aiCommandsReset -aiCommandsResult -aiCommandsStartGeneration -aiDisclaimer -all -allDocuments -allFormats -allKnowledgeGroups -allNotes -analyzing -analyzingFile -analyzingImage -apiError -associateKnowledgeGroup -autoAdjustChunk -autoAdjustOverlap -autoAdjustOverlapMin -back -backToWorkspace -baseApi -broad -browseFiles -browseManageFiles -btnChat -cancel -canvas -categories -category -categoryCreated -categoryDesc -categoryName -changePassword -changeUserPassword -chatDesc -chatHyperparameters -chatTitle -chatWithGroup -checkPDFStatusFailed -chunkConfig -chunkIndex -chunkInfo -chunkNumber -chunkOverlap -chunkSize -citationSources -clearFailed -clickToSelectAndNote -clickToSelectFolder -configured -confirm -confirmChange -confirmChangeEmbeddingModel -confirmClear -confirmClearKB -confirmDeleteCategory -confirmDeleteFile -confirmDeleteGroup -confirmDeleteHistory -confirmDeleteNote -confirmDeleteNotebook -confirmDeleteUser -confirmPassword -confirmPreciseCost -confirmRegeneratePDF -confirmRemoveFileFromGroup -confirmTitle -confirmUnsupportedFile -contentLength -contentOCR -conversionFailed -convertingInProgress -convertingPDF -copied -copy -copyContent -copySuccess -create -createAgent -createCategory -createCategoryBtn -createFailed -createFailedRetry -createGroupDesc -createNotebook -createNotebookTitle -createNow -createPDFNote -createUserFailed -createdAt -creating -creatingRegularUser -creative -ctx -currentPassword -daysAgo -defaultBadge -defaultForUploads -defaultLLMModel -defaultSettingFailed -defaultTenant -defaultVisionModel -delete -deleteFailed -deleteHistoryFailed -deleteHistorySuccess -deleteUser -deleteUserFailed -descPlaceholder -dimensions -dims -directoryLabel -documentsAndText -domainOptional -done -downloadPDF -downloadPDFFailed -dragDropUploadDesc -dragDropUploadTitle -dragToSelect -dropAnywhere -dropToIngest -editCategory -editNote -editNotebookTitle -editUserRole -embeddingModel -embeddingModelWarning -enableHyDE -enableHybridSearch -enableQueryExpansion -enableReranking -enterNamePlaceholder -enterNewPassword -enterNoteTitle -enterPageNumber -envLimitWeaker -error -errorGeneric -errorLabel -errorLoadData -errorMessage -errorNoModel -errorSaveFailed -errorTitleContentRequired -errorUploadFile -exampleResearch -exitFullscreen -exitSelectionMode -expandMenu -extractingText -failedToAddToGroup -failedToCreateCategory -failedToDeleteCategory -failedToRemoveFromGroup -failedToSaveSettings -fastMode -fastModeDesc -fastModeFeatures -featureUpdated -fileAddedToGroup -fileDeleted -fileRemovedFromGroup -fileSizeLimitExceeded -files -fillTargetName -filterGroupFiles -filterLowResults -filterNotesPlaceholder -fullTextSearch -fullscreenDisplay -geminiError -generalSettings -generalSettingsSubtitle -generatePDFPreviewButton -getUserListFailed -globalNoSpecificGroup -globalTenantControl -goToAdmin -groupCreated -groupDeleted -groupUpdated -groups -headerHyperparams -headerModelSelection -headerRetrieval -hidePreview -historyMessages -historyTitle -hybridSearchDesc -hybridVectorWeight -hybridVectorWeightDesc -hybridWeight -hydeDesc -idxCancel -idxDesc -idxEmbeddingModel -idxFiles -idxMethod -idxModalTitle -idxStart -imagesAndVision -importComplete -importFolder -importFolderTip -importFolderTitle -importToCurrentGroup -importedFromLocalFolder -indexingChunkingConfig -indexingConfigDesc -indexingConfigTitle -info -installPlugin -installedPlugin -kbCleared -kbManagement -kbManagementDesc -kbSettingsSaved -kbSettingsSubtitle -langEn -langJa -langZh -languageSettings -lblEmbedding -lblMaxTokens -lblRerank -lblRerankRef -lblTargetGroup -lblTemperature -lblTopK -loadFailed -loadHistoryFailed -loadLimitsFailed -loadMore -loadVisionModelFailed -loading -loadingHistoriesFailed -loadingPDF -loadingUserData -loginButton -loginDesc -loginError -loginRequired -loginTitle -loginToUpload -logout -matchScore -max -maxBatchSize -maxChunkSize -maxInput -maxOverlapSize -maxResponseTokens -maxValueMsg -min -mmAddBtn -mmCancel -mmEdit -mmEmpty -mmErrorBaseUrlRequired -mmErrorModelIdRequired -mmErrorNameRequired -mmErrorNotAuthenticated -mmFormApiKey -mmFormApiKeyPlaceholder -mmFormBaseUrl -mmFormModelId -mmFormName -mmFormType -mmSave -mmTitle -model -modelConfiguration -modelDisabled -modelEnabled -modelLimitsInfo -modelManagement -modelManagementSubtitle -modifySettings -name -nameHelp -namePlaceholder -navAgent -navCatalog -navChat -navKnowledge -navKnowledgeGroups -navNotebook -navPlugin -navTenants -needLogin -newChat -newGroup -newNote -newPassword -newPasswordMinLength -newTenant -next -nextStep -noContentToPreview -noDescriptionProvided -noFiles -noFilesDesc -noFilesFound -noGroups -noGroupsFound -noHistory -noHistoryDesc -noKnowledgeGroups -noNotesFound -noRerankModel -noTextExtracted -noVisionModels -none -noneUncategorized -noteCreatedFailed -noteCreatedSuccess -noteTitlePlaceholder -notebookDesc -notebooks -notebooksDesc -onlyAdminCanModify -openInNewWindow -openPDFInNewTabFailed -operational -optimizationTips -orgManagement -overlapRatioLimit -page -password -passwordChangeFailed -passwordChangeSuccess -passwordMinLength -passwordMismatch -passwordPlaceholder -pdfConversionError -pdfConversionFailed -pdfLoadError -pdfLoadFailed -pdfPreview -pdfPreviewReady -pendingFiles -personalNotebook -placeholderEmpty -placeholderNewGroup -placeholderText -placeholderWithFiles -pleaseSelect -pleaseSelectKnowledgeGroupFirst -pleaseWait -pluginBy -pluginCommunity -pluginConfig -pluginDesc -pluginOfficial -pluginTitle -position -precise -preciseMode -preciseModeDesc -preciseModeFeatures -preparingPDFConversion -preview -previewHeader -previewNotSupported -previous -processingMode -pureText -pureVector -queryExpansionDesc -readFailed -readingFailed -recommendationMsg -recommendationReason -reconfigureDesc -reconfigureFile -reconfigureTitle -regeneratePDF -releaseToIngest -requestRegenerationFailed -rerankModel -rerankSimilarityThreshold -rerankingDesc -resetZoom -retrievalSearchSettings -retry -roleRegularUser -roleTenantAdmin -save -saveChanges -saveNote -saveVisionModelFailed -saving -screenshotPreview -searchAgent -searchGroupsPlaceholder -searchPlaceholder -searchPlugin -searchResults -secureIngestion -secureProcessing -selectCategory -selectEmbedding -selectEmbeddingFirst -selectEmbeddingModel -selectFolderTip -selectKnowledgeGroup -selectKnowledgeGroups -selectLLM -selectLLMModel -selectOrganization -selectPageNumber -selectVisionModel -selectedFilesCount -selectedGroupsCount -settings -shortDescription -showPreview -showingRange -sidebarDesc -sidebarTitle -similarityThreshold -sourcePreview -startByCreatingNote -startProcessing -startWritingPlaceholder -statusIndexingDesc -statusReadyDesc -statusRunning -statusStopped -strict -subFolderPlaceholder -submitFailed -success -successNoteCreated -successNoteDeleted -successNoteUpdated -successUploadFile -supportedFormatsInfo -switchLanguage -systemConfiguration -systemHealth -systemUsers -tabSettings -targetRole -temperature -tenantsSubtitle -textarea -tipChunkTooLarge -tipMaxValues -tipOverlapSmall -tipPreciseCost -title -topK -totalChunks -totalTenants -typeEmbedding -typeLLM -typeRerank -typeVision -uncategorized -uncategorizedFiles -unknownError -unknownGroup -unsupportedFileType -updateFailedRetry -updatePlugin -updateUserFailed -updatedAtPrefix -uploadErrors -uploadFailed -uploadWarning -uploading -user -userAddedToOrganization -userCreatedSuccess -userDeletedSuccessfully -userDemotedFromAdmin -userList -userManagement -userManagementSubtitle -userPromotedToAdmin -username -usernamePlaceholder -vectorSimilarityThreshold -viewHistory -visionModelHelp -visionModelSettings -visualVision -warning -welcomeMessage -x-api-key -x-tenant-id -x-user-language -yesterday -zoomIn -zoomOut \ No newline at end of file diff --git a/apply_cjk_translations.js b/apply_cjk_translations.js deleted file mode 100644 index 9e9c74b..0000000 --- a/apply_cjk_translations.js +++ /dev/null @@ -1,337 +0,0 @@ -const fs = require('fs'); -const path = require('path'); - -const directories = ['d:/workspace/AuraK/web', 'd:/workspace/AuraK/server/src']; -const excludeDirs = ['node_modules', '.git', 'dist', '.next', 'dist-check', 'docs', 'data']; -const extensions = ['.ts', '.tsx', '.js', '.jsx']; - -const translations = { - // ChatInterface.tsx - "履歴メッセージの読み込みを処理": "Handle loading of history messages", - "履歴メッセージが読み込まれたことを親コンポーネントに通知": "Notify parent component that history messages have been loaded", - "デバウンス機構:500ms以内の重複送信を防止": "Debounce mechanism: prevent duplicate submissions within 500ms", - "入力欄を即座にクリアして高さをリセットし、重複送信を防止": "Instantly clear input field and reset height to prevent duplicate submission", - "フォーカスを外す": "Remove focus", - "初期ボットメッセージを追加": "Add initial bot message", - "グループフィルタを渡す": "Pass group filter", - "ファイルフィルタを渡す": "Pass file filter", - "履歴IDを渡す": "Pass history ID", - "Rerankスイッチを渡す": "Pass Rerank switch", - "RerankモデルIDを渡す": "Pass Rerank model ID", - "温度パラメータを渡す": "Pass temperature parameter", - "最大トークン数を渡す": "Pass max tokens", - "Top-Kパラメータを渡す": "Pass Top-K parameter", - "類似度しきい値を渡す": "Pass similarity threshold", - "Rerankしきい値を渡す": "Pass Rerank threshold", - "クエリ拡張を渡す": "Pass query expansion", - "HyDEを渡す": "Pass HyDE", - - // CreateNoteFromPDFDialog.tsx - "ナレッジグループが選択されているか確認": "Check if knowledge group is selected", - "使用 toast 提示用户先选择知识组": "Use toast to prompt user to select a knowledge group first", - - // FileGroupTags.tsx - "カスタムイベントを監視してグループセレクターを開く": "Monitor custom events to open group selector", - "正しい方法:すべてのグループID(既存 + 新規)を渡す": "Correct method: pass all group IDs (existing + new)", - - // GroupManager.tsx - "分组列表": "Group list", - "个文件": " files", - "创建按钮": "Create button", - "创建/编辑模态框": "Create/Edit modal", - "颜色标识": "Color indicator", - - // GroupSelector.tsx - "选择分组范围": "Select group scope", - "全部分组": "All groups", - "已选 ": "Selected ", - " 个分组": " groups", - "搜索分组...": "Search groups...", - "未找到相关分组": "No related groups found", - "暂无分组": "No groups", - - // IndexingModalWithMode.tsx - "ユーザーによる手動選択をマーク": "Mark manual selection by user", - - // InputDrawer.tsx - "确定": "Confirm", - "取消": "Cancel", - - // SidebarRail.tsx - "ナビゲーション項目": "Navigation items", - "現在のルートに基づいてアクティブなタブを決定": "Determine active tab based on current route", - - // ModeSelector.tsx - "処理モード選択コンポーネント": "Processing mode selection component", - "ファイルアップロード時に高速モードまたは精密モードを選択するために使用": "Used to select fast or precise mode when uploading files", - "推薦されたモードを自動選択": "Automatically select recommended mode", - "処理モードの選択": "Select processing mode", - "分析中...": "Analyzing...", - "模式推荐信息": "Mode recommendation info", - "推奨:": "Recommended:", - "模式选择": "Mode selection", - "高速モード": "Fast Mode", - "テキストを単純に抽出、高速、プレーンテキストドキュメントに最適": "Simple text extraction, fast, ideal for plain text documents", - "高速": "Fast", - "追加コストなし": "No additional cost", - "テキスト情報のみ処理": "Processes text information only", - "精密モード": "Precise Mode", - "内容を正確に認識し、完全な情報を保持": "Accurately recognizes content and retains full information", - "画像/表を認識": "Recognizes images/tables", - "レイアウト情報を保持": "Retains layout information", - "図文混合コンテンツ": "Mixed image and text content", - "API費用が必要": "API cost required", - "処理時間が長い": "Long processing time", - - // PDFPreview.tsx - "ズームレベルの状態を追加": "Add zoom level state", - "現在のレンダリングタスクを保存": "Save current rendering task", - "ダウンロード用にpdfUrlを設定": "Set pdfUrl for download", - "PDFデータを取得してblob URLを作成": "Fetch PDF data and create blob URL", - "PDF文書の読み込みとレンダリングを開始": "Start fetching and rendering PDF document", - "ページ切り替えまたはズームレベル変更時に再レンダリング": "Re-render on page change or zoom level change", - "ステータスがpendingの場合、変換を能動的にトリガー": "Actively trigger conversion if status is pending", - "PDF URLにアクセスして変換をトリガー": "Access PDF URL to trigger conversion", - "進行中のレンダリングタスクが存在する場合、キャンセルする": "Cancel rendering task if one is in progress", - "ページめくり後のスクロール位置調整": "Adjust scroll position after page turn", - "pdfUrlが既にある場合、直接ダウンロード": "Directly download if pdfUrl already exists", - "pdfUrlがない場合、直接取得してダウンロードを試みる": "Try fetching and downloading if pdfUrl does not exist", - "pdfUrlがない場合、直接取得して開くことを試みる": "Try fetching and opening if pdfUrl does not exist", - "状態をリセットして再読み込みをトリガー": "Reset state and trigger reload", - "連続ページめくりを防止": "Prevent rapid page turning", - "下にスクロールして次のページへ": "Scroll down for next page", - "上にスクロールして前のページへ": "Scroll up for previous page", - "头部": "Header", - "内容区域": "Content Area", - "エラーを無視し、デフォルト状態を使用": "Ignore error and use default state", - - // PDFSelectionTool.tsx - "オプションのズームレベルパラメータ": "Optional zoom level parameter", - "デフォルトのズームレベルは1.0": "Default zoom level is 1.0", - "コンテナに対する実際の座標を使用": "Use actual coordinates relative to container", - - // SettingsModal.tsx - "モデル一覧を再取得するためにページをリロード": "Reload page to fetch model list again", - "言語セクション": "Language section", - "中文": "Chinese", - "日本語": "Japanese", - "サイドバー": "Sidebar", - "コンテンツエリア": "Content Area", - - // Toast.tsx - "等待动画完成": "Wait for animation to complete", - - // ChatView.tsx - "历史记录按钮": "History button", - "新建对话按钮": "New chat button", - "知识库增强功能模态框": "Knowledge base enhancement features modal", - - // SettingsView.tsx - "ユーザー一覧の取得(ユーザータブがアクティブな場合)": "Fetch user list (if users tab is active)", - "一般タブのハンドラー": "General tab handlers", - "ユーザータブのハンドラー": "Users tab handlers", - "ユーザーリストを再取得": "Re-fetch user list", - "モデルタブのハンドラー": "Models tab handlers", - "レンダリング関数": "Rendering functions", - "パスワード変更セクション": "Change password section", - "语言设置セクション": "Language settings section", - - // ToastContext.tsx - "相同消息去重:如果已存在相同的消息(类型和内容相同),则先移除旧的": "Deduplicate identical messages: discard old one if current type and content are the same", - - // apiClient.ts - "新しい API 呼び出し方法、{ data, status } を返す": "New API call method, returns { data, status }", - - // chatService.ts - "追加: 選択された LLM ID": "Added: Selected LLM ID", - "追加: 選択されたグループ": "Added: Selected groups", - "追加: 選択されたファイル": "Added: Selected files", - "追加: 会話履歴 ID": "Added: Conversation history ID", - "追加: Rerank を有効にする": "Added: Enable Rerank", - "追加: Rerank モデル ID": "Added: Rerank model ID", - "追加: temperature パラメータ": "Added: temperature parameter", - "追加: maxTokens パラメータ": "Added: maxTokens parameter", - "追加: topK パラメータ": "Added: topK parameter", - "追加: similarityThreshold パラメータ": "Added: similarityThreshold parameter", - "追加: rerankSimilarityThreshold パラメータ": "Added: rerankSimilarityThreshold parameter", - "追加: enableQueryExpansion": "Added: enableQueryExpansion", - "追加: enableHyDE": "Added: enableHyDE", - "追加": "Added", - "グループフィルタパラメータを渡す": "Pass group filter parameters", - "ファイルフィルタパラメータを渡す": "Pass file filter parameters", - "履歴 ID を渡す": "Pass history ID", - "temperature パラメータを渡す": "Pass temperature parameter", - "maxTokens パラメータを渡す": "Pass maxTokens parameter", - "topK パラメータを渡す": "Pass topK parameter", - "similarityThreshold パラメータを渡す": "Pass similarityThreshold parameter", - "rerankSimilarityThreshold パラメータを渡す": "Pass rerankSimilarityThreshold parameter", - "enableQueryExpansion を渡す": "Pass enableQueryExpansion", - "enableHyDE を渡す": "Pass enableHyDE", - "リクエストに失敗しました": "Request failed", - "サーバーエラー": "Server error", - "レスポンスストリームを読み取れません": "Cannot read response stream", - "ネットワークエラー": "Network error", - - // chunkConfigService.ts - "チャンク設定サービス - チャンク設定の制限の取得と検証に使用": "Chunk configuration service - Used to fetch and validate chunk configuration limits", - "最大チャンクサイズ": "Max chunk size", - "最大重複サイズ": "Max overlap size", - "最小重複サイズ": "Min overlap size", - "デフォルトチャンクサイズ": "Default chunk size", - "デフォルト重複サイズ": "Default overlap size", - "モデル情報": "Model info", - "モデル名": "Model name", - "モデル入力制限": "Model input limit", - "モデルバッチ制限": "Model batch limit", - "期待されるベクトル次元数": "Expected vector dimensions", - "チャンク設定の制限を取得": "Fetch chunk configuration limits", - "埋め込みモデルID": "Embedding model ID", - "認証トークン": "Auth token", - "設定制限情報": "Configuration limit info", - "チャンク設定が有効かどうかを検証": "Validate if chunk configuration is valid", - "チャンクサイズ": "Chunk size", - "重複サイズ": "Overlap size", - "設定制限": "Config limits", - "検証結果とエラー情報": "Validation results and error info", - "チャンクサイズの検証": "Validate chunk size", - "が上限": " exceeds limit ", - "を超えています": "", - "が最小値": " is below minimum ", - "未満です": "", - "重複サイズの検証": "Validate overlap size", - "がチャンクサイズの50%": " exceeds 50% of chunk size ", - "表示用に制限情報をフォーマット": "Format limit info for display", - "モデル:": "Model:", - "チャンク上限:": "Max Chunk:", - "重複上限:": "Max Overlap:", - "バッチ制限:": "Batch Limit:", - "ベクトル次元:": "Vector Dimensions:", - - // geminiService.ts - "请始终使用中文回答。": "Please always answer in English.", - "常に日本語で答えてください。": "Please always answer in English.", - "RAG検索(知識ベースファイルがある場合)": "RAG search (when knowledge base files exist)", - "検索ステータスがリセットされていることを確認": "Ensure search status is reset", - "APIキーはオプションです - ローカルモデルを許可します": "API key is optional - allow local models", - "より詳細なエラー情報を提供": "Provide more detailed error information", - "ネットワーク接続に失敗しました。サーバーの状態を確認してください": "Network connection failed. Please check server status", - - // knowledgeGroupService.ts - "すべてのグループを取得": "Fetch all groups", - "グループを作成": "Create group", - "グループを更新": "Update group", - "グループを削除": "Delete group", - "グループ内のファイルを取得": "Fetch files in group", - "ファイルをグループに追加": "Add file to group", - "グループからファイルを削除": "Remove file from group", - - // noteService.ts - "すべてのノートを取得(オプションでグループによるフィルタリングが可能)": "Fetch all notes (optional group filtering)", - "ノートを作成": "Create note", - "ノートを更新": "Update note", - "ノートを削除": "Delete note", - "ノートを知識ベースにインデックス(ベクトル化)": "Index note to knowledge base (vectorize)", - - // ocrService.ts - "OCR サービス - 画像テキスト認識関連の処理を担当": "OCR Service - Handles image text recognition", - "画像内のテキストを認識": "Recognize text in image", - - // pdfPreviewService.ts - "PDFプレビューサービス - PDFファイルのプレビュー状態と変換処理の管理を担当": "PDF Preview Service - Manages PDF preview state and conversion processing", - "PDFファイルがプレビュー可能か(画像に変換済みか)を確認": "Check if PDF file is previewable (converted to image)", - "ファイル情報またはPDF URL": "File info or PDF URL", - "認証状態用のトークン": "Auth token", - "変換状態": "Conversion state", - "存在しない場合はPDFの画像変換をトリガー": "Trigger PDF image conversion if not exists", - "この時点で変換ジョブがキューに追加されたとみなす": "At this point, assume conversion job has been queued", - - // ragService.ts - "RAG(Retrieval-Augmented Generation)サービス": "RAG (Retrieval-Augmented Generation) Service", - "ベクトル検索、ハイブリッド検索、再ランキング機能を提供": "Provides vector search, hybrid search, and reranking functionalities", - "チャンクテキスト": "Chunk text", - "スコア(類似度)": "Score (similarity)", - "ソースファイルのID": "Source file ID", - "ソースファイルの元の名前": "Original source file name", - "チャンクのインデックス": "Chunk index", - "チャンクのメタデータ": "Chunk metadata", - "検索結果": "Search results", - "元のユーザーの質問": "Original user question", - "拡張されたクエリ(クエリ拡張が有効な場合)": "Expanded queries (if query expansion is enabled)", - "ベクトル検索を実行": "Execute vector search", - "質問テキスト": "Question text", - "使用する埋め込みモデルのID": "Embedding model ID to use", - "オプションのフィルタ(グループ等)": "Optional filters (groups, etc)", - "再ランキングモデルを実行": "Execute reranking model", - "検索パラメーター": "Search parameters", - - // searchHistoryService.ts - "検索とチャットの履歴を管理するサービス": "Service for managing search and chat history", - "最新の履歴から順に取得": "Fetch history in descending order", - "ページ番号": "Page number", - "1ページあたりの件数": "Items per page", - "指定したIDの履歴詳細(メッセージを含む)を取得": "Fetch history details (including messages) for specific ID", - "新しい履歴エントリを作成": "Create new history entry", - "最初のメッセージから生成されたタイトル": "Title generated from first message", - "指定した履歴を削除": "Delete specified history", - "既存の履歴を更新(タイトル等)": "Update existing history (title, etc)", - "更新するデータ": "Data to update", - - // uploadService.ts - "チャンク設定付きでファイルをアップロード": "Upload file with chunk configuration", - "アップロードするファイル": "File to upload", - "テキストコンテンツを直接アップロードして処理": "Directly upload and process text content", - "テキストコンテンツ": "Text content", - "アップロード用のタイトル/ファイル名": "Title/filename for upload", - "チャンク設定": "Chunk configuration", - "ファイルモードの推奨を取得": "Get recommended file mode", - - // Other Server files - "コストを重視したVision Pipelineを使用して画像をテキストに変換": "Convert image to text using cost-aware Vision Pipeline", - - // translation_map.json - " `💰 推定コスト: $${estimatedCost.toFixed(2)}, 推定時間: ${duration.toFixed(1)}s`\n )": " `💰 Estimated cost: $${estimatedCost.toFixed(2)}, Estimated time: ${duration.toFixed(1)}s`\n )", - " this.logger.log(`💰 推定コスト: $${estimatedCost.toFixed(2)}, 推定時間: ${duration.toFixed(1)}s`);": " this.logger.log(`💰 Estimated cost: $${estimatedCost.toFixed(2)}, Estimated time: ${duration.toFixed(1)}s`);", - "チャンクサイズ ${chunkSize} が上限 ${limits.maxChunkSize} を超えています": "Chunk size ${chunkSize} exceeds maximum limit ${limits.maxChunkSize}", - "チャンクサイズ ${chunkSize} が最小値 50 未満です": "Chunk size ${chunkSize} is below minimum 50", - "重複サイズ ${chunkOverlap} が上限 ${limits.maxOverlapSize} を超えています": "Overlap size ${chunkOverlap} exceeds maximum limit ${limits.maxOverlapSize}", - "重複サイズ ${chunkOverlap} がチャンクサイズの50% (${maxOverlapByRatio}) を超えています": "Overlap size ${chunkOverlap} exceeds 50% of chunk size (${maxOverlapByRatio})" -}; - -function walkSync(currentDirPath, callback) { - fs.readdirSync(currentDirPath).forEach((name) => { - const filePath = path.join(currentDirPath, name); - const stat = fs.statSync(filePath); - if (stat.isFile()) { - callback(filePath); - } else if (stat.isDirectory() && !excludeDirs.includes(name)) { - walkSync(filePath, callback); - } - }); -} - -let modifiedCount = 0; - -directories.forEach(d => { - walkSync(d, (filePath) => { - if (extensions.some(ext => filePath.endsWith(ext))) { - try { - let content = fs.readFileSync(filePath, 'utf-8'); - let originalContent = content; - - for (const [key, value] of Object.entries(translations)) { - content = content.split(key).join(value); - } - - if (content !== originalContent) { - fs.writeFileSync(filePath, content, 'utf-8'); - console.log(`Updated: ${filePath}`); - modifiedCount++; - } - } catch (e) { - console.error(`Error reading ${filePath}: `, e); - } - } - }); -}); - -console.log(`Updated ${modifiedCount} files`); diff --git a/apply_cjk_translations.py b/apply_cjk_translations.py deleted file mode 100644 index 8199e85..0000000 --- a/apply_cjk_translations.py +++ /dev/null @@ -1,332 +0,0 @@ -import os -import re - -directories = ['d:/workspace/AuraK/web', 'd:/workspace/AuraK/server/src'] -exclude_dirs = ['node_modules', '.git', 'dist', '.next', 'dist-check', 'docs', 'data'] -extensions = ['.ts', '.tsx', '.js', '.jsx'] - -cjk_pattern = re.compile(r'[\u4e00-\u9fff\u3040-\u309f\u30a0-\u30ff]+') - -translations = { - # ChatInterface.tsx - "履歴メッセージの読み込みを処理": "Handle loading of history messages", - "履歴メッセージが読み込まれたことを親コンポーネントに通知": "Notify parent component that history messages have been loaded", - "デバウンス機構:500ms以内の重複送信を防止": "Debounce mechanism: prevent duplicate submissions within 500ms", - "入力欄を即座にクリアして高さをリセットし、重複送信を防止": "Instantly clear input field and reset height to prevent duplicate submission", - "フォーカスを外す": "Remove focus", - "初期ボットメッセージを追加": "Add initial bot message", - "グループフィルタを渡す": "Pass group filter", - "ファイルフィルタを渡す": "Pass file filter", - "履歴IDを渡す": "Pass history ID", - "Rerankスイッチを渡す": "Pass Rerank switch", - "RerankモデルIDを渡す": "Pass Rerank model ID", - "温度パラメータを渡す": "Pass temperature parameter", - "最大トークン数を渡す": "Pass max tokens", - "Top-Kパラメータを渡す": "Pass Top-K parameter", - "類似度しきい値を渡す": "Pass similarity threshold", - "Rerankしきい値を渡す": "Pass Rerank threshold", - "クエリ拡張を渡す": "Pass query expansion", - "HyDEを渡す": "Pass HyDE", - - # CreateNoteFromPDFDialog.tsx - "ナレッジグループが選択されているか確認": "Check if knowledge group is selected", - "使用 toast 提示用户先选择知识组": "Use toast to prompt user to select a knowledge group first", - - # FileGroupTags.tsx - "カスタムイベントを監視してグループセレクターを開く": "Monitor custom events to open group selector", - "正しい方法:すべてのグループID(既存 + 新規)を渡す": "Correct method: pass all group IDs (existing + new)", - - # GroupManager.tsx - "分组列表": "Group list", - "个文件": " files", - "创建按钮": "Create button", - "创建/编辑模态框": "Create/Edit modal", - "颜色标识": "Color indicator", - - # GroupSelector.tsx - "选择分组范围": "Select group scope", - "全部分组": "All groups", - "已选": "Selected", - "个分组": " groups", - "搜索分组...": "Search groups...", - "未找到相关分组": "No related groups found", - "暂无分组": "No groups", - - # IndexingModalWithMode.tsx - "ユーザーによる手動選択をマーク": "Mark manual selection by user", - - # InputDrawer.tsx - "确定": "Confirm", - "取消": "Cancel", - - # SidebarRail.tsx - "ナビゲーション項目": "Navigation items", - "現在のルートに基づいてアクティブなタブを決定": "Determine active tab based on current route", - - # ModeSelector.tsx - "処理モード選択コンポーネント": "Processing mode selection component", - "ファイルアップロード時に高速モードまたは精密モードを選択するために使用": "Used to select fast or precise mode when uploading files", - "推薦されたモードを自動選択": "Automatically select recommended mode", - "処理モードの選択": "Select processing mode", - "分析中...": "Analyzing...", - "模式推荐信息": "Mode recommendation info", - "推奨:": "Recommended:", - "模式选择": "Mode selection", - "高速モード": "Fast Mode", - "テキストを単純に抽出、高速、プレーンテキストドキュメントに最適": "Simple text extraction, fast, ideal for plain text documents", - "高速": "Fast", - "追加コストなし": "No additional cost", - "テキスト情報のみ処理": "Processes text information only", - "精密モード": "Precise Mode", - "内容を正確に認識し、完全な情報を保持": "Accurately recognizes content and retains full information", - "画像/表を認識": "Recognizes images/tables", - "レイアウト情報を保持": "Retains layout information", - "図文混合コンテンツ": "Mixed image and text content", - "API費用が必要": "API cost required", - "処理時間が長い": "Long processing time", - - # PDFPreview.tsx - "ズームレベルの状態を追加": "Add zoom level state", - "現在のレンダリングタスクを保存": "Save current rendering task", - "ダウンロード用にpdfUrlを設定": "Set pdfUrl for download", - "PDFデータを取得してblob URLを作成": "Fetch PDF data and create blob URL", - "PDF文書の読み込みとレンダリングを開始": "Start fetching and rendering PDF document", - "ページ切り替えまたはズームレベル変更時に再レンダリング": "Re-render on page change or zoom level change", - "ステータスがpendingの場合、変換を能動的にトリガー": "Actively trigger conversion if status is pending", - "PDF URLにアクセスして変換をトリガー": "Access PDF URL to trigger conversion", - "進行中のレンダリングタスクが存在する場合、キャンセルする": "Cancel rendering task if one is in progress", - "ページめくり後のスクロール位置調整": "Adjust scroll position after page turn", - "pdfUrlが既にある場合、直接ダウンロード": "Directly download if pdfUrl already exists", - "pdfUrlがない場合、直接取得してダウンロードを試みる": "Try fetching and downloading if pdfUrl does not exist", - "pdfUrlがない場合、直接取得して開くことを試みる": "Try fetching and opening if pdfUrl does not exist", - "状態をリセットして再読み込みをトリガー": "Reset state and trigger reload", - "連続ページめくりを防止": "Prevent rapid page turning", - "下にスクロールして次のページへ": "Scroll down for next page", - "上にスクロールして前のページへ": "Scroll up for previous page", - "头部": "Header", - "内容区域": "Content Area", - "エラーを無視し、デフォルト状態を使用": "Ignore error and use default state", - - # PDFSelectionTool.tsx - "オプションのズームレベルパラメータ": "Optional zoom level parameter", - "デフォルトのズームレベルは1.0": "Default zoom level is 1.0", - "コンテナに対する実際の座標を使用": "Use actual coordinates relative to container", - - # SettingsModal.tsx - "モデル一覧を再取得するためにページをリロード": "Reload page to fetch model list again", - "言語セクション": "Language section", - "中文": "Chinese", - "日本語": "Japanese", - "サイドバー": "Sidebar", - "コンテンツエリア": "Content Area", - - # Toast.tsx - "等待动画完成": "Wait for animation to complete", - - # ChatView.tsx - "历史记录按钮": "History button", - "新建对话按钮": "New chat button", - "知识库增强功能模态框": "Knowledge base enhancement features modal", - - # SettingsView.tsx - "ユーザー一覧の取得(ユーザータブがアクティブな場合)": "Fetch user list (if users tab is active)", - "一般タブのハンドラー": "General tab handlers", - "ユーザータブのハンドラー": "Users tab handlers", - "ユーザーリストを再取得": "Re-fetch user list", - "モデルタブのハンドラー": "Models tab handlers", - "レンダリング関数": "Rendering functions", - "パスワード変更セクション": "Change password section", - "语言设置セクション": "Language settings section", - - # ToastContext.tsx - "相同消息去重:如果已存在相同的消息(类型和内容相同),则先移除旧的": "Deduplicate identical messages: discard old one if current type and content are the same", - - # apiClient.ts - "新しい API 呼び出し方法、{ data, status } を返す": "New API call method, returns { data, status }", - - # chatService.ts - "追加: 選択された LLM ID": "Added: Selected LLM ID", - "追加: 選択されたグループ": "Added: Selected groups", - "追加: 選択されたファイル": "Added: Selected files", - "追加: 会話履歴 ID": "Added: Conversation history ID", - "追加: Rerank を有効にする": "Added: Enable Rerank", - "追加: Rerank モデル ID": "Added: Rerank model ID", - "追加: temperature パラメータ": "Added: temperature parameter", - "追加: maxTokens パラメータ": "Added: maxTokens parameter", - "追加: topK パラメータ": "Added: topK parameter", - "追加: similarityThreshold パラメータ": "Added: similarityThreshold parameter", - "追加: rerankSimilarityThreshold パラメータ": "Added: rerankSimilarityThreshold parameter", - "追加: enableQueryExpansion": "Added: enableQueryExpansion", - "追加: enableHyDE": "Added: enableHyDE", - "追加": "Added", - "グループフィルタパラメータを渡す": "Pass group filter parameters", - "ファイルフィルタパラメータを渡す": "Pass file filter parameters", - "履歴 ID を渡す": "Pass history ID", - "temperature パラメータを渡す": "Pass temperature parameter", - "maxTokens パラメータを渡す": "Pass maxTokens parameter", - "topK パラメータを渡す": "Pass topK parameter", - "similarityThreshold パラメータを渡す": "Pass similarityThreshold parameter", - "rerankSimilarityThreshold パラメータを渡す": "Pass rerankSimilarityThreshold parameter", - "enableQueryExpansion を渡す": "Pass enableQueryExpansion", - "enableHyDE を渡す": "Pass enableHyDE", - "リクエストに失敗しました": "Request failed", - "サーバーエラー": "Server error", - "レスポンスストリームを読み取れません": "Cannot read response stream", - "ネットワークエラー": "Network error", - - # chunkConfigService.ts - "チャンク設定サービス - チャンク設定の制限の取得と検証に使用": "Chunk configuration service - Used to fetch and validate chunk configuration limits", - "最大チャンクサイズ": "Max chunk size", - "最大重複サイズ": "Max overlap size", - "最小重複サイズ": "Min overlap size", - "デフォルトチャンクサイズ": "Default chunk size", - "デフォルト重複サイズ": "Default overlap size", - "モデル情報": "Model info", - "モデル名": "Model name", - "モデル入力制限": "Model input limit", - "モデルバッチ制限": "Model batch limit", - "期待されるベクトル次元数": "Expected vector dimensions", - "チャンク設定の制限を取得": "Fetch chunk configuration limits", - "埋め込みモデルID": "Embedding model ID", - "認証トークン": "Auth token", - "設定制限情報": "Configuration limit info", - "チャンク設定が有効かどうかを検証": "Validate if chunk configuration is valid", - "チャンクサイズ": "Chunk size", - "重複サイズ": "Overlap size", - "設定制限": "Config limits", - "検証結果とエラー情報": "Validation results and error info", - "チャンクサイズの検証": "Validate chunk size", - "が上限": " exceeds limit ", - "を超えています": "", - "が最小値": " is below minimum ", - "未満です": "", - "重複サイズの検証": "Validate overlap size", - "がチャンクサイズの50%": " exceeds 50% of chunk size ", - "表示用に制限情報をフォーマット": "Format limit info for display", - "モデル:": "Model:", - "チャンク上限:": "Max Chunk:", - "重複上限:": "Max Overlap:", - "バッチ制限:": "Batch Limit:", - "ベクトル次元:": "Vector Dimensions:", - - # geminiService.ts - "请始终使用中文回答。": "Please always answer in English.", - "常に日本語で答えてください。": "Please always answer in English.", - "RAG検索(知識ベースファイルがある場合)": "RAG search (when knowledge base files exist)", - "検索ステータスがリセットされていることを確認": "Ensure search status is reset", - "APIキーはオプションです - ローカルモデルを許可します": "API key is optional - allow local models", - "より詳細なエラー情報を提供": "Provide more detailed error information", - "ネットワーク接続に失敗しました。サーバーの状態を確認してください": "Network connection failed. Please check server status", - - # knowledgeGroupService.ts - "すべてのグループを取得": "Fetch all groups", - "グループを作成": "Create group", - "グループを更新": "Update group", - "グループを削除": "Delete group", - "グループ内のファイルを取得": "Fetch files in group", - "ファイルをグループに追加": "Add file to group", - "グループからファイルを削除": "Remove file from group", - - # noteService.ts - "すべてのノートを取得(オプションでグループによるフィルタリングが可能)": "Fetch all notes (optional group filtering)", - "ノートを作成": "Create note", - "ノートを更新": "Update note", - "ノートを削除": "Delete note", - "ノートを知識ベースにインデックス(ベクトル化)": "Index note to knowledge base (vectorize)", - - # ocrService.ts - "OCR サービス - 画像テキスト認識関連の処理を担当": "OCR Service - Handles image text recognition", - "画像内のテキストを認識": "Recognize text in image", - - # pdfPreviewService.ts - "PDFプレビューサービス - PDFファイルのプレビュー状態と変換処理の管理を担当": "PDF Preview Service - Manages PDF preview state and conversion processing", - "PDFファイルがプレビュー可能か(画像に変換済みか)を確認": "Check if PDF file is previewable (converted to image)", - "ファイル情報またはPDF URL": "File info or PDF URL", - "認証状態用のトークン": "Auth token", - "変換状態": "Conversion state", - "存在しない場合はPDFの画像変換をトリガー": "Trigger PDF image conversion if not exists", - "この時点で変換ジョブがキューに追加されたとみなす": "At this point, assume conversion job has been queued", - - # ragService.ts - "RAG(Retrieval-Augmented Generation)サービス": "RAG (Retrieval-Augmented Generation) Service", - "ベクトル検索、ハイブリッド検索、再ランキング機能を提供": "Provides vector search, hybrid search, and reranking functionalities", - "チャンクテキスト": "Chunk text", - "スコア(類似度)": "Score (similarity)", - "ソースファイルのID": "Source file ID", - "ソースファイルの元の名前": "Original source file name", - "チャンクのインデックス": "Chunk index", - "チャンクのメタデータ": "Chunk metadata", - "検索結果": "Search results", - "元のユーザーの質問": "Original user question", - "拡張されたクエリ(クエリ拡張が有効な場合)": "Expanded queries (if query expansion is enabled)", - "ベクトル検索を実行": "Execute vector search", - "質問テキスト": "Question text", - "使用する埋め込みモデルのID": "Embedding model ID to use", - "オプションのフィルタ(グループ等)": "Optional filters (groups, etc)", - "再ランキングモデルを実行": "Execute reranking model", - "検索パラメーター": "Search parameters", - - # searchHistoryService.ts - "検索とチャットの履歴を管理するサービス": "Service for managing search and chat history", - "最新の履歴から順に取得": "Fetch history in descending order", - "ページ番号": "Page number", - "1ページあたりの件数": "Items per page", - "指定したIDの履歴詳細(メッセージを含む)を取得": "Fetch history details (including messages) for specific ID", - "新しい履歴エントリを作成": "Create new history entry", - "最初のメッセージから生成されたタイトル": "Title generated from first message", - "指定した履歴を削除": "Delete specified history", - "既存の履歴を更新(タイトル等)": "Update existing history (title, etc)", - "更新するデータ": "Data to update", - - # uploadService.ts - "チャンク設定付きでファイルをアップロード": "Upload file with chunk configuration", - "アップロードするファイル": "File to upload", - "テキストコンテンツを直接アップロードして処理": "Directly upload and process text content", - "テキストコンテンツ": "Text content", - "アップロード用のタイトル/ファイル名": "Title/filename for upload", - "チャンク設定": "Chunk configuration", - "ファイルモードの推奨を取得": "Get recommended file mode", - - # api-v1.controller.ts - # Other Server files - "コストを重視したVision Pipelineを使用して画像をテキストに変換": "Convert image to text using cost-aware Vision Pipeline", - - # translation_map.json entries - " `💰 推定コスト: $${estimatedCost.toFixed(2)}, 推定時間: ${duration.toFixed(1)}s`\n )": " `💰 Estimated cost: $${estimatedCost.toFixed(2)}, Estimated time: ${duration.toFixed(1)}s`\n )", - " this.logger.log(`💰 推定コスト: $${estimatedCost.toFixed(2)}, 推定時間: ${duration.toFixed(1)}s`);": " this.logger.log(`💰 Estimated cost: $${estimatedCost.toFixed(2)}, Estimated time: ${duration.toFixed(1)}s`);", - "チャンクサイズ ${chunkSize} が上限 ${limits.maxChunkSize} を超えています": "Chunk size ${chunkSize} exceeds maximum limit ${limits.maxChunkSize}", - "チャンクサイズ ${chunkSize} が最小値 50 未満です": "Chunk size ${chunkSize} is below minimum 50", - "重複サイズ ${chunkOverlap} が上限 ${limits.maxOverlapSize} を超えています": "Overlap size ${chunkOverlap} exceeds maximum limit ${limits.maxOverlapSize}", - "重複サイズ ${chunkOverlap} がチャンクサイズの50% (${maxOverlapByRatio}) を超えています": "Overlap size ${chunkOverlap} exceeds 50% of chunk size (${maxOverlapByRatio})" -} - -def translate_file(filepath): - try: - with open(filepath, 'r', encoding='utf-8') as f: - content = f.read() - - original_content = content - - # Replace exact matches from translations dict - for k, v in translations.items(): - content = content.replace(k, v) - - # Also clean up any loose CJK comments by replacing them with a generic English comment - # Find all lines with // and CJK - def replace_generic_cjk(match): - return "// Translated comment or string" - - if content != original_content: - with open(filepath, 'w', encoding='utf-8') as f: - f.write(content) - print(f"Updated: {filepath}") - except Exception as e: - print(f"Failed to process {filepath}: {e}") - -for d in directories: - for root, dirs, files in os.walk(d): - dirs[:] = [dir for dir in dirs if dir not in exclude_dirs] - for file in files: - if any(file.endswith(ext) for ext in extensions): - filepath = os.path.join(root, file) - translate_file(filepath) diff --git a/apply_translations.js b/apply_translations.js deleted file mode 100644 index 93c078c..0000000 --- a/apply_translations.js +++ /dev/null @@ -1,43 +0,0 @@ -const fs = require('fs'); - -const files = require('./files_to_translate.json'); -const translationMap = require('./translation_map.json'); - -let totalReplaced = 0; - -files.forEach(file => { - let content = fs.readFileSync(file, 'utf8'); - let originalContent = content; - - // Replace simple strings - const simpleStringRegex = /((?:console|logger|Logger|this\.logger)\.(?:log|error|warn|info|debug|verbose)\(\s*)(['"])(.*?[\u4e00-\u9fa5]+.*?)\2/g; - content = content.replace(simpleStringRegex, (match, prefix, quote, innerString) => { - if (translationMap[innerString]) { - totalReplaced++; - return prefix + quote + translationMap[innerString] + quote; - } - return match; - }); - - // Replace template literals - const templateRegex = /((?:console|logger|Logger|this\.logger)\.(?:log|error|warn|info|debug|verbose)\(\s*)\`([\s\S]*?)\`/g; - content = content.replace(templateRegex, (match, prefix, innerString) => { - if (/[\\u4e00-\\u9fa5]/.test(innerString) && translationMap[innerString]) { - totalReplaced++; - return prefix + '`' + translationMap[innerString] + '`'; - } - // If no direct match, check if there's an exact match in the map - if (translationMap[innerString]) { - totalReplaced++; - return prefix + '`' + translationMap[innerString] + '`'; - } - return match; - }); - - if (content !== originalContent) { - fs.writeFileSync(file, content, 'utf8'); - console.log('Updated ' + file); - } -}); - -console.log('Total replacements made: ' + totalReplaced); diff --git a/auto_dict.json b/auto_dict.json deleted file mode 100644 index 6da83e3..0000000 --- a/auto_dict.json +++ /dev/null @@ -1,133 +0,0 @@ -{ - "console.log('Final LLM model used (default):', llmModel ? llmModel.name : '无');": "console.log('Final LLM model used (default):', llmModel ? llmModel.name : '无');", - "`data: ${JSON.stringify({ type: 'error', data: '请在模型管理中添加LLM模型并配置API密钥' })}\\n\\n`,": "`data: ${JSON.stringify({ type: 'error', data: 'Please add LLM model and configure API key in model management' })}\\n\\n`,", - "`data: ${JSON.stringify({ type: 'error', data: error.message || '服务器错误' })}\\n\\n`,": "`data: ${JSON.stringify({ type: 'error', data: error.message || 'Server Error' })}\\n\\n`,", - "`data: ${JSON.stringify({ type: 'error', data: '未找到LLM模型配置' })}\\n\\n`,": "`data: ${JSON.stringify({ type: 'error', data: 'LLM model configuration not found' })}\\n\\n`,", - "console.log('ユーザーID:', userId);": "console.log('User ID:', userId);", - "console.log('API Key プレフィックス:', modelConfig.apiKey?.substring(0, 10) + '...');": "console.log('API Key prefix:', modelConfig.apiKey?.substring(0, 10) + '...');", - "提供されたテキスト内容を、ユーザーの指示に基づいて修正または改善してください。": "Correct or improve the provided text content based on your instructions.", - "挨拶や結びの言葉(「わかりました、こちらが...」など)は含めず、修正後の内容のみを直接出力してください。": "Please do not include any greetings or closing words (such as \"Okay, this is...\") and directly output only the revised content.", - "コンテキスト(現在の内容):": "Context (current contents):", - "ユーザーの指示:": "User instructions:", - "1. **段落与结构**:": "1. **Paragraph and Structure**:", - "- 使用清晰的段落分隔,每个要点之间空一行": "- Use clear paragraph separation with a blank line between each bullet point", - "- 使用标题(## 或 ###)组织长回答": "- Use headings (## or ###) to organize long answers", - "2. **文本格式**:": "2. **Text Format**:", - "- 使用 **粗体** 强调重要概念和关键词": "- Use **bold** to emphasize important concepts and keywords", - "- 使用列表(- 或 1.)组织多个要点": "- Use lists (- or 1.) to organize multiple points", - "- 使用 \\`代码\\` 标记技术术语、命令、文件名": "- Use \\`code\\` to mark technical terms, commands, file names", - "3. **代码展示**:": "3. **Code display**:", - "- 使用代码块展示代码,并指定语言:": "- Use code blocks to display code and specify the language:", - "return \"示例\"": "return \"example\"", - "- 支持语言:python, javascript, typescript, java, bash, sql 等": "- Supported languages: python, javascript, typescript, java, bash, sql, etc.", - "4. **图表与可视化**:": "4. **Charts and Visualization**:", - "- 使用 Mermaid 语法绘制流程图、序列图等:": "- Use Mermaid syntax to draw flowcharts, sequence diagrams, etc.:", - "A[开始] --> B[处理]": "A[Start] --> B[Process]", - "B --> C[结束]": "B --> C[end]", - "- 适用场景:流程、架构、状态机、时序图": "- Applicable scenarios: process, architecture, state machine, sequence diagram", - "5. **其他要求**:": "5. **Other requirements**:", - "- 回答精炼准确": "- Answer concisely and accurately", - "- 多步骤操作使用有序列表": "- Use ordered lists for multi-step operations", - "- 对比类信息建议用表格展示(如果适用)": "- It is recommended to display comparative information in tables (if applicable)", - "ナレッジベースの内容:": "Knowledge base contents:", - "会話履歴:": "Conversation history:", - "ユーザーの質問:{question}": "User question: {question}", - "1. **段落と構造**:": "1. **Paragraphs and Structure**:", - "- 明確な段落分けを使用し、要点間に空行を入れる": "- Use clear paragraphing and leave blank lines between main points", - "- 長い回答には見出し(## または ###)を使用": "- Use headings (## or ###) for long answers", - "2. **テキスト書式**:": "2. **Text Format**:", - "- 重要な概念やキーワードを強調するために **太字** を使用": "- Use **bold** to highlight important concepts and keywords", - "- 複数のポイントを整理するためにリスト(- または 1.)を使用": "- Use lists (- or 1.) to organize multiple points", - "- 技術用語、コマンド、ファイル名をマークするために \\`コード\\` を使用": "- Use \\`code\\` to mark technical terms, commands, and file names", - "3. **コード表示**:": "3. **Code display**:", - "- 言語を指定してコードブロックを使用:": "- Use code blocks by specifying language:", - "return \"例\"": "return \"Example\"", - "- 対応言語:python, javascript, typescript, java, bash, sql など": "- Supported languages: python, javascript, typescript, java, bash, sql, etc.", - "4. **図表とチャート**:": "4. **Diagrams and Charts**:", - "- フローチャート、シーケンス図などに Mermaid 構文を使用:": "- Use Mermaid syntax for flowcharts, sequence diagrams, etc:", - "A[開始] --> B[処理]": "A[Start] --> B[Process]", - "B --> C[終了]": "B --> C[End]", - "- 使用例:プロセスフロー、アーキテクチャ図、状態図、シーケンス図": "- Usage examples: process flow, architecture diagram, state diagram, sequence diagram", - "5. **その他の要件**:": "5. **Other Requirements**:", - "- 簡潔で明確な回答を心がける": "- Keep your answers concise and clear", - "- 複数のステップがある場合は番号付きリストを使用": "- Use numbered lists when there are multiple steps", - "- 比較情報には表を使用(該当する場合)": "- Use tables for comparative information (if applicable)", - "インテリジェントアシスタントとして、ユーザーの質問に答えてください。": "Become an intelligent assistant and answer users' questions.", - "只返回标题文本。不要包含任何解释性文字或前导词(如“标题是:”)。": "Only the title text is returned. Do not include any explanatory text or leading words (such as \"The title is:\").", - "语言:Chinese": "Language: Chinese", - "文本内容:": "Text content:", - "タイトルテキストのみを返してください。説明文や前置き(例:「タイトルは:」)は含めないでください。": "Please return only the title text. Do not include descriptive text or prefaces (e.g. \"The title is:\").", - "言語:Japanese": "Language: Japanese", - "テキスト:": "text:", - "return `根据以下对话片段,生成一个简短、描述性的标题(不超过50个字符),总结讨论的主题。": "return `Based on the following conversation snippet, generate a short, descriptive title (no more than 50 characters) summarizing the topic of the discussion.", - "只返回标题文本。不要包含任何前导词。": "Only the title text is returned. Do not include any leading words.", - "用户: ${userMessage}": "User: ${userMessage}", - "助手: ${aiResponse}`;": "Helper: ${aiResponse}`;", - "return `以下の会話スニペットに基づいて、トピックを要約する短く説明的なタイトル(最大50文字)を生成してください。": "return `Generate a short, descriptive title (up to 50 characters) that summarizes the topic based on the conversation snippet below.", - "タイトルのみを返してください。前置きは不要です。": "Please return only the title. No preface necessary.", - "ユーザー: ${userMessage}": "User: ${userMessage}", - "アシスタント: ${aiResponse}`;": "Assistant: ${aiResponse}`;", - "const providerName = modelConfig.providerName || '不明';": "const providerName = modelConfig.providerName || '不明';", - "` - プロバイダー: ${providerName}\\n` +": "` - Provider: ${providerName}\\n` +", - "` - Token制限: ${maxInputTokens}\\n` +": "` - Token limit: ${maxInputTokens}\\n` +", - "` - ベクトルモデルか: ${isVectorModel}`,": "` - Vector model: ${isVectorModel}`,", - "`Chunk size: ${chunkSize} tokens (制限: ${limits.maxInputTokens})`,": "`Chunk size: ${chunkSize} tokens (制限: ${limits.maxInputTokens})`,", - "`重なりサイズ: ${chunkOverlap} tokens`,": "`Overlap size: ${chunkOverlap} tokens`,", - "`バッチサイズ: ${limits.maxBatchSize}`,": "`Batch size: ${limits.maxBatchSize}`,", - "throw new Error(`埋め込みモデル設定 ${embeddingModelConfigId} が見つかりません`);": "throw new Error(`Embedded model configuration ${embeddingModelConfigId} not found`);", - "throw new Error(`モデル ${modelConfig.name} は無効化されているため、埋め込みベクトルを生成できません`);": "throw new Error(`Unable to generate embedding vector because model ${modelConfig.name} is disabled`);", - "throw new Error(`モデル ${modelConfig.name} に baseUrl が設定されていません`);": "throw new Error(`baseUrl not set for model ${modelConfig.name}`);", - "`総計 ${totalLength} 文字、平均 ${Math.round(avgLength)} 文字、` +": "`Total ${totalLength} characters, average ${Math.round(avgLength)} characters, ` +", - "`モデル制限: ${modelConfig.maxInputTokens || 8192} tokens`": "`Model limit: ${modelConfig.maxInputTokens || 8192} tokens`", - "`テキスト長がモデルの制限。` +": "`Text length is a limitation of the model. ` +", - "`現在: ${texts.length} 個のテキストで計 ${totalLength} 文字、` +": "`Currently: ${texts.length} texts totaling ${totalLength} characters, ` +", - "`モデル制限: ${modelConfig.maxInputTokens || 8192} tokens。` +": "`Model limit: ${modelConfig.maxInputTokens || 8192} tokens. ` +", - "`アドバイス: Chunk sizeまたはバッチサイズを小さくしてください`": "`Advice: Reduce chunk size or batch size`", - "this.logger.error(`リクエストパラメータ: model=${modelConfig.modelId}, inputLength=${texts[0]?.length}`);": "this.logger.error(`Request parameters: model=${modelConfig.modelId}, inputLength=${texts[0]?.length}`);", - "throw new Error(`埋め込み API の呼び出しに失敗しました: ${response.statusText} - ${errorText}`);": "throw new Error(`Embedded API call failed: ${response.statusText} - ${errorText}`);", - "if (error.message && (error.message.includes('context length') || error.message.includes('コンテキスト長 exceeds limit ') || error.message.includes('コンテキスト長 exceeds limit '))) {": "if (error.message && (error.message.includes('context length') || error.message.includes('context length exceeds limit ') || error.message.includes('context length exceeds limit '))) {", - "throw new NotFoundException('ファイルが存在しません');": "throw new NotFoundException('File does not exist');", - "throw new Error(`メモリ待機がタイムアウトしました: 現在 ${this.getMemoryUsage().heapUsed}MB > ${this.MAX_MEMORY_MB * 0.85}MB`);": "throw new Error(`Memory wait timed out: Currently ${this.getMemoryUsage().heapUsed}MB > ${this.MAX_MEMORY_MB * 0.85}MB`);", - "throw new Error(`ファイルが存在しません: ${filePath}`);": "throw new Error(`File does not exist: ${filePath}`);", - "throw new Error('変換がタイムアウトしました。ファイルが大きすぎる可能性があります');": "throw new Error('Conversion timed out. File may be too large');", - "throw new Error(`変換に失敗しました: ${detail}`);": "throw new Error(`Conversion failed: ${detail}`);", - "throw new Error(`変換に失敗しました: ${lastError.message}`);": "throw new Error(`Conversion failed: ${lastError.message}`);", - "throw new Error('LibreOffice サービスが実行されていません。サービスの状態を確認してください');": "throw new Error('LibreOffice service is not running. Please check the status of the service');", - "throw new Error('LibreOffice サービスとの接続が切断されました。サービスが不安定である可能性があります');": "throw new Error('The connection to the LibreOffice service has been lost. The service may be unstable');", - "@Min(1, { message: 'ベクトル次元の最小値は 1 です' })": "@Min(1, { message: 'The minimum value of the vector dimension is 1' })", - "@Max(4096, { message: 'ベクトル次元の最大値は 4096 です(Elasticsearch の制限)' })": "@Max(4096, { message: 'The maximum vector dimension is 4096 (Elasticsearch limit)' })", - "throw new Error(`PDF ファイルが存在しません: ${pdfPath}`);": "throw new Error(`PDF file does not exist: ${pdfPath}`);", - "throw new Error('PDF のページ数を取得できません');": "throw new Error('Unable to get page number of PDF');", - "throw new Error(`Python での変換に失敗しました: ${result.error}`);": "throw new Error(`Python conversion failed: ${result.error}`);", - "throw new Error(`PDF から画像への変換に失敗しました: ${error.message}`);": "throw new Error(`PDF to image conversion failed: ${error.message}`);", - "throw new Error('Embedding model IDが提供されていません');": "throw new Error('Embedding model ID not provided');", - "return { message: '对话历史删除成功' };": "return { message: 'Conversation history deleted successfully' };", - "`ユーザー ${req.user.id} がファイルをアップロードしました: ${file.originalname} (${this.formatBytes(file.size)})`,": "`User ${req.user.id} uploaded file: ${file.originalname} (${this.formatBytes(file.size)})`,", - "console.log('パスワード:', randomPassword);": "console.log('Password:', randomPassword);", - "console.log('=== updateLanguage デバッグ ===');": "console.log('=== updateLanguage Debug ===');", - "console.log('=== getLanguage デバッグ ===');": "console.log('=== getLanguage Debug ===');", - "page: pageIndex ? ` (第 ${pageIndex} ページ)` : '',": "page: pageIndex ? ` (th page ${pageIndex})` : '',", - "if (errorCode === 429 || errorMessage.includes('rate limit') || errorMessage.includes('リクエストが多すぎます')) {": "if (errorCode === 429 || errorMessage.includes('rate limit') || errorMessage.includes('Too many requests')) {", - "return { isGood: false, reason: `ファイルが小さすぎます (${sizeKB.toFixed(2)}KB)`, score: 0 };": "return { isGood: false, reason: `File is too small (${sizeKB.toFixed(2)}KB)`, score: 0 };", - "return { isGood: false, reason: `ファイルが大きすぎます (${sizeKB.toFixed(2)}KB)`, score: 0 };": "return { isGood: false, reason: `File is too large (${sizeKB.toFixed(2)}KB)`, score: 0 };", - "reason: `クォータ不足: 残り $${quota.remaining.toFixed(2)}, 必要 $${estimatedCost.toFixed(2)}`,": "reason: `Insufficient quota: remaining $${quota.remaining.toFixed(2)}, required $${estimatedCost.toFixed(2)}`,", - "throw new Error(`ユーザー ${userId} は存在しません`);": "throw new Error(`User ${userId} does not exist`);", - "message: `⚠️ クォータ使用率が ${usagePercent.toFixed(1)}% に達しました。残り $${quota.remaining.toFixed(2)}`,": "message: `⚠️ Quota usage has reached ${usagePercent.toFixed(1)}%. Remaining $${quota.remaining.toFixed(2)}`,", - "message: `💡 クォータ使用率 ${usagePercent.toFixed(1)}%。コストの管理に注意してください`,": "message: `💡 Quota usage ${usagePercent.toFixed(1)}%. Be careful with controlling costs`,", - "return `${seconds.toFixed(0)}秒`;": "return `${seconds.toFixed(0)}秒`;", - "return `${minutes}分${remainingSeconds.toFixed(0)}秒`;": "return `${minutes}分${remainingSeconds.toFixed(0)}秒`;", - "this.updateStatus('converting', 10, 'ドキュメント形式を変換中...');": "this.updateStatus('converting', 10, 'Converting document format...');", - "this.updateStatus('splitting', 30, 'PDF を画像に変換中...');": "this.updateStatus('splitting', 30, 'Converting PDF to image...');", - "throw new Error('PDF から画像への変換に失敗しました。画像が生成されませんでした');": "throw new Error('PDF to image conversion failed. No image was generated');", - "this.updateStatus('checking', 40, 'クォータを確認し、コストを見積もり中...');": "this.updateStatus('checking', 40, 'Checking quotas and estimating costs...');", - "this.updateStatus('analyzing', 50, 'ビジョンモデルを使用してページをAnalyzing...');": "this.updateStatus('analyzing', 50, 'Analyzing the page using the vision model...');", - "this.updateStatus('completed', 100, '処理が完了しました。一時ファイルをクリーンアップ中...');": "this.updateStatus('completed', 100, 'Processing completed. Cleaning up temporary files...');", - "throw new Error(`モデル設定が見つかりません: ${modelId}`);": "throw new Error(`Model configuration not found: ${modelId}`);", - "reason: `サポートされていないファイル形式です: ${ext}`,": "reason: `Unsupported file format: ${ext}`,", - "warnings: ['Fast Mode(テキスト抽出のみ)を使用します'],": "warnings: ['Using Fast Mode (text extraction only)'],", - "reason: `形式 ${ext} はPrecise Modeをサポートしていません`,": "reason: `Format ${ext} does not support Precise Mode`,", - "reason: 'ファイルが大きいため、完全な情報を保持するためにPrecise Modeを推奨します',": "reason: 'Due to large files, Precise Mode is recommended to retain complete information',", - "warnings: ['処理時間が長くなる可能性があります', 'API 費用が発生します'],": "warnings: ['Processing time may be longer', 'API charges may apply'],", - "reason: 'Precise Modeが利用可能です。テキストと画像の混合コンテンツを保持できます',": "reason: 'Precise Mode is available. Can hold mixed content of text and images',", - "warnings: ['API 費用が発生します'],": "warnings: ['API charges will apply']," -} \ No newline at end of file diff --git a/auto_replace.js b/auto_replace.js deleted file mode 100644 index 4c520bb..0000000 --- a/auto_replace.js +++ /dev/null @@ -1,60 +0,0 @@ -const fs = require('fs'); -const path = require('path'); - -const cjkFiles = fs.readFileSync('cjk_files.txt', 'utf8').split('\n').map(l => l.trim()).filter(l => l.length > 0); -let dict = {}; -try { - dict = require('./auto_dict.json'); -} catch (e) { - console.error('auto_dict.json not found, skipping literal translations.'); -} - -// Ensure messages.ts and translations.ts are skipped -const filesToProcess = cjkFiles.filter(f => !f.includes('translations.ts') && !f.includes('messages.ts') && !f.includes('i18n.service.ts')); - -let modifiedCount = 0; - -function escapeRegExp(string) { - return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string -} - -for (const filePath of filesToProcess) { - if (!fs.existsSync(filePath)) { - console.warn(`File not found: ${filePath}`); - continue; - } - - try { - let content = fs.readFileSync(filePath, 'utf8'); - let originalContent = content; - - // 1. Literal translation from map - for (const [key, value] of Object.entries(dict)) { - // Need to exact replace because string matching - if (content.includes(key)) { - content = content.split(key).join(value); - } - } - - // 2. Regex replace remaining CJK comments - // Block comments: /** ... CJK ... */ or /* ... CJK ... */ - content = content.replace(/\/\*([\s\S]*?)[\u4e00-\u9fa5\u3040-\u30ff]([\s\S]*?)\*\//g, (match) => { - return '/* [Translated Comment] */'; - }); - - // Inline comments: // ... CJK ... - content = content.replace(/\/\/[ \t]*[^\n]*[\u4e00-\u9fa5\u3040-\u30ff][^\n]*/g, (match) => { - return '// [Translated Comment]'; - }); - - if (content !== originalContent) { - fs.writeFileSync(filePath, content, 'utf8'); - console.log(`Updated: ${filePath}`); - modifiedCount++; - } - } catch (e) { - console.error(`Failed to process ${filePath}:`, e); - } -} - -console.log(`Successfully updated ${modifiedCount} files.`); diff --git a/auto_translator.js b/auto_translator.js deleted file mode 100644 index f013262..0000000 --- a/auto_translator.js +++ /dev/null @@ -1,52 +0,0 @@ -const fs = require('fs'); -const path = require('path'); - -const stringsToTranslate = fs.readFileSync('true_code.txt', 'utf8').split('\n').filter(l => l.trim().length > 0 && !l.trim().startsWith('*')); - -// Exclude i18n.service.ts Chinese/Japanese prompt templates -const filtered = stringsToTranslate.filter(s => { - if (s.includes('你是一个文档分析师')) return false; - if (s.includes('あなたはドキュメントアナライザーです')) return false; - if (s.includes('基于以下知识库内容回答用户问题')) return false; - if (s.includes('以下のナレッジベースの内容に基づいてユーザーの質問に答えてください')) return false; - if (s.includes('请用Chinese回答')) return false; - if (s.includes('Japaneseで回答してください')) return false; - if (s.includes('用户问题:{question}')) return false; - if (s.includes('历史对话:')) return false; - if (s.includes('知识库内容:')) return false; - if (s.includes('作为智能助手')) return false; - if (s.includes('片段:')) return false; - if (s.includes('スニペット:')) return false; - return true; -}); - -async function translateText(text) { - try { - const url = `https://translate.googleapis.com/translate_a/single?client=gtx&sl=auto&tl=en&dt=t&q=${encodeURIComponent(text)}`; - const res = await fetch(url); - const data = await res.json(); - return data[0].map(x => x[0]).join(''); - } catch (e) { - return null; - } -} - -async function main() { - console.log(`Starting translation for ${filtered.length} strings...`); - const dict = {}; - for (let i = 0; i < filtered.length; i++) { - const s = filtered[i]; - const translated = await translateText(s); - if (translated) { - dict[s] = translated; - if (i % 10 === 0) console.log(`Translated ${i + 1}/${filtered.length}`); - } else { - console.log(`Failed to translate: ${s}`); - } - await new Promise(r => setTimeout(r, 200)); // Sleep to avoid rate limits - } - fs.writeFileSync('auto_dict.json', JSON.stringify(dict, null, 2)); - console.log('Successfully generated auto_dict.json'); -} - -main(); diff --git a/backend_cjk.txt b/backend_cjk.txt deleted file mode 100644 index bfd4d34..0000000 --- a/backend_cjk.txt +++ /dev/null @@ -1,404 +0,0 @@ -openAIApiKey: config.apiKey || 'ollama', // ローカルモデルの場合は key が不要な場合がある -modelName: config.modelId, // modelId に修正 -); // modelId に修正 -selectedLLMId?: string; // 新增:选中的 LLM 模型 ID -selectedGroups?: string[]; // 新增 -selectedFiles?: string[]; // 新增:选中的文件 -historyId?: string; // 新增 -enableRerank?: boolean; // 新增 -selectedRerankId?: string; // 新增 -temperature?: number; // 新增:temperature 参数 -maxTokens?: number; // 新增:maxTokens 参数 -topK?: number; // 新增:topK 参数 -similarityThreshold?: number; // 新増:similarityThreshold 参数 -rerankSimilarityThreshold?: number; // 新増:rerankSimilarityThreshold 参数 -enableQueryExpansion?: boolean; // 新增 -enableHyDE?: boolean; // 新增 -console.log('Final LLM model used (default):', llmModel ? llmModel.name : '无'); -`data: ${JSON.stringify({ type: 'error', data: '请在模型管理中添加LLM模型并配置API密钥' })}\n\n`, -selectedGroups, // 新增 -selectedFiles, // 新增 -historyId, // 新增 -temperature, // 传递 temperature 参数 -maxTokens, // 传递 maxTokens 参数 -topK, // 传递 topK 参数 -similarityThreshold, // 传递 similarityThreshold 参数 -rerankSimilarityThreshold, // 传递 rerankSimilarityThreshold 参数 -enableQueryExpansion, // 传递 enableQueryExpansion -enableHyDE, // 传递 enableHyDE -`data: ${JSON.stringify({ type: 'error', data: error.message || '服务器错误' })}\n\n`, -`data: ${JSON.stringify({ type: 'error', data: '未找到LLM模型配置' })}\n\n`, -selectedGroups?: string[], // 新規:選択されたグループ -selectedFiles?: string[], // 新規:選択されたファイル -historyId?: string, // 新規:対話履歴ID -temperature?: number, // 新規: temperature パラメータ -maxTokens?: number, // 新規: maxTokens パラメータ -topK?: number, // 新規: topK パラメータ -similarityThreshold?: number, // 新規: similarityThreshold パラメータ -rerankSimilarityThreshold?: number, // 新規: rerankSimilarityThreshold パラメータ -enableQueryExpansion?: boolean, // 新規 -enableHyDE?: boolean, // 新規 -tenantId?: string // 新規: tenant isolation -console.log('ユーザーID:', userId); -console.log('API Key プレフィックス:', modelConfig.apiKey?.substring(0, 10) + '...'); -tenantId || 'default', // 新規 -let effectiveFileIds = selectedFiles; // 明示的に指定されたファイルを優先 -提供されたテキスト内容を、ユーザーの指示に基づいて修正または改善してください。 -挨拶や結びの言葉(「わかりました、こちらが...」など)は含めず、修正後の内容のみを直接出力してください。 -コンテキスト(現在の内容): -ユーザーの指示: -selectedGroups?: string[], // 新規パラメータ -explicitFileIds?: string[], // 新規パラメータ -selectedGroups, // 選択されたグループを渡す -explicitFileIds, // 明示的なファイルIDを渡す -temperature: settings.temperature ?? 0.7, // ユーザー設定またはデフォルトを使用 -* 対話内容に基づいてチャットのタイトルを自動生成する -* アプリケーション全体で使用される定数定義 -refresh: true, // 即座に検索に反映させる -score: this.normalizeScore(hit._score), // スコアの正規化 -selectedGroups?: string[], // 後方互換性のために残す(未使用) -explicitFileIds?: string[], // 明示的に指定されたファイルIDリスト -const maxScore = Math.max(...allScores, 1); // ゼロ除算を避けるため最小1 -* Elasticsearch スコアを 0-1 の範囲に正規化する -* Elasticsearch のスコアは 1.0 を超える可能性があるため、正規化が必要 -* ただし、kNN検索の類似度スコアは既に0-1の範囲にある(cosine similarity)ので、 -* 特別な正規化は不要。必要に応じて最小値保護のみ行う。 -if (!rawScore || rawScore <= 0) return 0; // 最小値は0 -* 指定されたファイルのすべてのチャンクを取得 -size: 10000, // 単一ファイルが 10000 チャンクを超えないと想定 -excludes: ['vector'], // 転送量を減らすため、ベクトルデータは返さない -private readonly defaultLanguage = 'ja'; // プロジェクト要件に従い、Japaneseをデフォルトとして使用 -基于以下知识库内容回答用户问题。 -**重要提示**: 用户已选择特定知识组,请严格基于以下知识库内容回答。如果知识库中没有相关信息,请明确告知用户:"${noMatchMsg}",然后再提供答案。 -知识库内容: -历史对话: -用户问题:{question} -请用Chinese回答,并严格遵循以下 Markdown 格式要求: -1. **段落与结构**: -- 使用清晰的段落分隔,每个要点之间空一行 -- 使用标题(## 或 ###)组织长回答 -2. **文本格式**: -- 使用 **粗体** 强调重要概念和关键词 -- 使用列表(- 或 1.)组织多个要点 -- 使用 \`代码\` 标记技术术语、命令、文件名 -3. **代码展示**: -- 使用代码块展示代码,并指定语言: -return "示例" -- 支持语言:python, javascript, typescript, java, bash, sql 等 -4. **图表与可视化**: -- 使用 Mermaid 语法绘制流程图、序列图等: -A[开始] --> B[处理] -B --> C[结束] -- 适用场景:流程、架构、状态机、时序图 -5. **其他要求**: -- 回答精炼准确 -- 多步骤操作使用有序列表 -- 对比类信息建议用表格展示(如果适用) -作为智能助手,请回答用户的问题。 -请用Chinese回答。 -} else { // 默认为日语,符合项目要求 -以下のナレッジベースの内容に基づいてユーザーの質問に答えてください。 -**重要**: ユーザーが特定の知識グループを選択しました。以下のナレッジベースの内容に厳密に基づいて回答してください。ナレッジベースに関連情報がない場合は、「${noMatchMsg}」とユーザーに明示的に伝えてから、回答を提供してください。 -ナレッジベースの内容: -会話履歴: -ユーザーの質問:{question} -Japaneseで回答してください。以下の Markdown 書式要件に厳密に従ってください: -1. **段落と構造**: -- 明確な段落分けを使用し、要点間に空行を入れる -- 長い回答には見出し(## または ###)を使用 -2. **テキスト書式**: -- 重要な概念やキーワードを強調するために **太字** を使用 -- 複数のポイントを整理するためにリスト(- または 1.)を使用 -- 技術用語、コマンド、ファイル名をマークするために \`コード\` を使用 -3. **コード表示**: -- 言語を指定してコードブロックを使用: -return "例" -- 対応言語:python, javascript, typescript, java, bash, sql など -4. **図表とチャート**: -- フローチャート、シーケンス図などに Mermaid 構文を使用: -A[開始] --> B[処理] -B --> C[終了] -- 使用例:プロセスフロー、アーキテクチャ図、状態図、シーケンス図 -5. **その他の要件**: -- 簡潔で明確な回答を心がける -- 複数のステップがある場合は番号付きリストを使用 -- 比較情報には表を使用(該当する場合) -インテリジェントアシスタントとして、ユーザーの質問に答えてください。 -Japaneseで回答してください。 -return `你是一个文档分析师。请阅读以下文本(文档开Header分),并生成一个简炼、专业的标题(不超过50个字符)。 -只返回标题文本。不要包含任何解释性文字或前导词(如“标题是:”)。 -语言:Chinese -文本内容: -return `あなたはドキュメントアナライザーです。以下のテキスト(ドキュメントの冒頭部分)を読み、簡潔でプロフェッショナルなタイトル(最大50文字)を生成してください。 -タイトルテキストのみを返してください。説明文や前置き(例:「タイトルは:」)は含めないでください。 -言語:Japanese -テキスト: -return `根据以下对话片段,生成一个简短、描述性的标题(不超过50个字符),总结讨论的主题。 -只返回标题文本。不要包含任何前导词。 -片段: -用户: ${userMessage} -助手: ${aiResponse}`; -return `以下の会話スニペットに基づいて、トピックを要約する短く説明的なタイトル(最大50文字)を生成してください。 -タイトルのみを返してください。前置きは不要です。 -スニペット: -ユーザー: ${userMessage} -アシスタント: ${aiResponse}`; -* Chunk configurationサービス -* チャンクパラメータの検証と管理を担当し、モデルの制限や環境変数の設定に適合していることを確認します -* 制限の優先順位: -* 1. 環境変数 (MAX_CHUNK_SIZE, MAX_OVERLAP_SIZE) -* 2. データベース内のモデル設定 (maxInputTokens, maxBatchSize) -* 3. デフォルト値 -maxOverlapRatio: DEFAULT_MAX_OVERLAP_RATIO, // 重なりはChunk sizeの50%まで -maxBatchSize: DEFAULT_MAX_BATCH_SIZE, // デフォルトのバッチ制限 -expectedDimensions: DEFAULT_VECTOR_DIMENSIONS, // デフォルトのベクトル次元 -* モデルの制限設定を取得(データベースから読み込み) -const providerName = modelConfig.providerName || '不明'; -` - プロバイダー: ${providerName}\n` + -` - Token制限: ${maxInputTokens}\n` + -` - ベクトルモデルか: ${isVectorModel}`, -* Chunk configurationを検証および修正 -* 優先順位: 環境変数の上限 > モデルの制限 > ユーザー設定 -const safetyMargin = 0.8; // 80% 安全マージン、バッチ処理のためにスペースを確保 -1000000, // 1MB のテキストを想定 -* 推奨されるバッチサイズを取得 -200, // 安全のための上限 -return Math.max(10, recommended); // 最低10個 -* チャンク数を推定 -* ベクトル次元の検証 -* 設定概要を取得(ログ用) -`Chunk size: ${chunkSize} tokens (制限: ${limits.maxInputTokens})`, -`重なりサイズ: ${chunkOverlap} tokens`, -`バッチサイズ: ${limits.maxBatchSize}`, -* フロントエンド用のConfig limitsを取得 -* フロントエンドのスライダーの上限設定に使用 -throw new Error(`埋め込みモデル設定 ${embeddingModelConfigId} が見つかりません`); -throw new Error(`モデル ${modelConfig.name} は無効化されているため、埋め込みベクトルを生成できません`); -throw new Error(`モデル ${modelConfig.name} に baseUrl が設定されていません`); -await new Promise(resolve => setTimeout(resolve, 100)); // 100ms待機 -* モデルIDに基づいて最大バッチサイズを決定 -return Math.min(10, configuredMaxBatchSize || 100); // Googleの場合は10を上限 -return Math.min(2048, configuredMaxBatchSize || 2048); // OpenAI v3は2048 exceeds limit -* 単一バッチの埋め込み処理 -`総計 ${totalLength} 文字、平均 ${Math.round(avgLength)} 文字、` + -`モデル制限: ${modelConfig.maxInputTokens || 8192} tokens` -`テキスト長がモデルの制限。` + -`現在: ${texts.length} 個のテキストで計 ${totalLength} 文字、` + -`モデル制限: ${modelConfig.maxInputTokens || 8192} tokens。` + -`アドバイス: Chunk sizeまたはバッチサイズを小さくしてください` -this.logger.error(`リクエストパラメータ: model=${modelConfig.modelId}, inputLength=${texts[0]?.length}`); -throw new Error(`埋め込み API の呼び出しに失敗しました: ${response.statusText} - ${errorText}`); -* Fetch chunk configuration limits(フロントエンドのスライダー設定用) -* クエリパラメータ: embeddingModelId - Embedding model ID -fs.unlinkSync(pdfPath); // 空のファイルを削除 -EXTRACTED = 'extracted', // テキスト抽出が完了し、データベースに保存されました -VECTORIZED = 'vectorized', // ベクトル化が完了し、ES にインデックスされました -FAST = 'fast', // Fast Mode - Tika を使用 -PRECISE = 'precise', // Precise Mode - Vision Pipeline を使用 -@Column({ name: 'user_id', nullable: true }) // 暫定的に空を許可(デバッグ用)、将来的には必須にすべき -content: string; // Tika で抽出されたテキスト内容を保存 -metadata: any; // Addedのメタデータを保存(画像の説明、信頼度など) -pdfPath: string; // PDF ファイルパス(プレビュー用) -ragPrompt: query, // オリジナルのクエリを使用 -* Fast Mode処理(既存フロー) -* Precise Mode処理(新規フロー) -* Precise Modeの結果をインデックス -* PDF の特定ページの画像を取得 -if (error.message && (error.message.includes('context length') || error.message.includes('コンテキスト長 exceeds limit ') || error.message.includes('コンテキスト長 exceeds limit '))) { -[chunk.content], // 単一テキスト -* バッチ処理、メモリ制御付き -* 失敗したファイルのベクトル化を再試行 -throw new NotFoundException('ファイルが存在しません'); -* ファイルのすべてのチャンク情報を取得 -* モデルの実際の次元数を取得(キャッシュ確認とプローブロジック付き) -* AIを使用して文書のタイトルを自動生成する -heapUsed: number; // 使用済みヒープメモリ (MB) -heapTotal: number; // 総ヒープメモリ (MB) -external: number; // 外部メモリ (MB) -rss: number; // RSS (常駐セットサイズ) (MB) -this.MAX_MEMORY_MB = parseInt(process.env.MAX_MEMORY_USAGE_MB || '1024'); // 1GB上限 -this.BATCH_SIZE = parseInt(process.env.CHUNK_BATCH_SIZE || '100'); // 1バッチあたり100チャンク -this.GC_THRESHOLD_MB = parseInt(process.env.GC_THRESHOLD_MB || '800'); // 800MBでGCをトリガー -* 現在のメモリ使用状況を取得 -* メモリ exceeds limit に近づいているかチェック -return usage.heapUsed > this.MAX_MEMORY_MB * 0.85; // 85%閾値 -* メモリが利用可能になるまで待機(タイムアウトあり) -throw new Error(`メモリ待機がタイムアウトしました: 現在 ${this.getMemoryUsage().heapUsed}MB > ${this.MAX_MEMORY_MB * 0.85}MB`); -* ガベージコレクションを強制実行(可能な場合) -* バッチサイズを動的に調整 -* 大規模データの処理:自動バッチングとメモリ制御 -* 処理に必要なメモリを見積もる -* バッチ処理を使用すべきかチェック -const threshold = this.MAX_MEMORY_MB * 0.7; // 70%閾値 -* LibreOffice サービスインターフェース定義 -pdf_data?: string; // base64 エンコードされた PDF データ -* LibreOffice サービスの状態をチェック -* ドキュメントを PDF に変換 -* @param filePath 変換するファイルのパス -* @returns PDF ファイルのパス -throw new Error(`ファイルが存在しません: ${filePath}`); -timeout: 300000, // 5分タイムアウト -responseType: 'stream', // ファイルストリームを受信 -maxRedirects: 5, // リダイレクトの最大数 -const delay = 2000 * attempt; // だんだん増える遅延 -throw new Error('変換がタイムアウトしました。ファイルが大きすぎる可能性があります'); -throw new Error(`変換に失敗しました: ${detail}`); -throw new Error(`変換に失敗しました: ${lastError.message}`); -throw new Error('LibreOffice サービスが実行されていません。サービスの状態を確認してください'); -throw new Error('LibreOffice サービスとの接続が切断されました。サービスが不安定である可能性があります'); -* ファイルの一括変換 -* サービスのバージョン情報を取得 -@Min(1, { message: 'ベクトル次元の最小値は 1 です' }) -@Max(4096, { message: 'ベクトル次元の最大値は 4096 です(Elasticsearch の制限)' }) -* モデルの入力トークン制限(embedding/rerank にのみ有効) -* バッチ処理の制限(embedding/rerank にのみ有効) -* ベトルモデルかどうか -* モデルプロバイダー名 -* このモデルを有効にするかどうか -* このモデルをデフォルトとして使用するかどうか -dimensions?: number; // 埋め込みモデルの次元、システムによって自動的に検出され保存されます -* モデルの入力トークン制限 -* 例: OpenAI=8191, Gemini=2048 -* 一括処理制限(1回のリクエストあたりの最大入力数) -* 例: OpenAI=2048, Gemini=100 -* ベトルモデルかどうか(システム設定での識別用) -* ユーザーは使用しないモデルを無効にして、誤選択を防ぐことができます -* 各タイプ(llm, embedding, rerank)ごとに1つのみデフォルトにできます -* モデルプロバイダー名(表示および識別用) -* 例: "OpenAI", "Google Gemini", "Custom" -* 指定されたモデルをデフォルトに設定 -* 指定されたタイプのデフォルトモデルを取得 -* 厳密なルール:Index Chat Configで指定されたモデルのみを返し、なければエラーを投げる -* PDF 转图片接口定义 -density?: number; // DPI 分辨率,默认 300 -quality?: number; // JPEG 质量 (1-100),默认 85 -format?: 'jpeg' | 'png'; // 输出格式,默认 jpeg -outDir?: string; // 输出目录,默认 ./temp -path: string; // 图片文件路径 -pageIndex: number; // 页码(从 1 开始) -size: number; // 文件大小(字节) -width?: number; // 图片宽度 -height?: number; // 图片高度 -* PDF を画像リストに変換します -* ImageMagick の convert コマンドを使用します -throw new Error(`PDF ファイルが存在しません: ${pdfPath}`); -throw new Error('PDF のページ数を取得できません'); -throw new Error(`Python での変換に失敗しました: ${result.error}`); -throw new Error(`PDF から画像への変換に失敗しました: ${error.message}`); -* 複数の PDF を一括変換 -* 画像ファイルのクリーンアップ -* ディレクトリのクリーンアップ -* 画像品質が妥当か確認 -originalScore?: number; // Rerank前のスコア(デバッグ用) -vectorSimilarityThreshold: number = 0.3, // ベクトル検索のしきい値 -rerankSimilarityThreshold: number = 0.5, // Rerankのしきい値(デフォルト0.5) -queriesToSearch = [hydeDoc]; // HyDE の場合は仮想ドキュメントをクエリとして使用 -throw new Error('Embedding model IDが提供されていません'); -effectiveTopK * 2 // 少し多めに残す -score: r.score, // Rerank スコア -originalScore: originalItem.score // 元のスコア -* Search resultsの重複排除 -* クエリを拡張してバリエーションを生成 -.slice(0, 3); // 最大3つに制限 -* 仮想的なドキュメント(HyDE)を生成 -* 内部タスク用の LLM インスタンスを取得 -* リランクの実行 -* @param query ユーザーのクエリ -* @param documents 候補ドキュメントリスト -* @param userId ユーザーID -* @param rerankModelId 選択された Rerank モデル設定ID -* @param topN 返す結果の数 (上位 N 個) -return { message: '对话历史删除成功' }; -mode?: 'fast' | 'precise'; // 処理モード -`ユーザー ${req.user.id} がファイルをアップロードしました: ${file.originalname} (${this.formatBytes(file.size)})`, -estimatedChunks: Math.ceil(file.size / (indexingConfig.chunkSize * 4)), // 推定チャンク数 -); // 環境変数からアップロードパスを取得し、ない場合はデフォルトとして './uploads' を使用します -fileSize: maxFileSize, // ファイルサイズの制限 -console.log('パスワード:', randomPassword); -import { User } from '../user/user.entity'; // Userエンティティのパス -console.log('=== updateLanguage デバッグ ==='); -console.log('=== getLanguage デバッグ ==='); -* システム全体のグローバル設定を取得する -* システム全体のグローバル設定を更新する -* Vision 服务接口定义 -text: string; // 抽出されたテキスト内容 -images: ImageDescription[]; // 画像の説明 -layout: string; // レイアウトの種類 -confidence: number; // 信頼度 (0-1) -pageIndex?: number; // 页码 -type: string; // 图片类型 (图表/架构图/流程图等) -description: string; // 详细描述 -position?: number; // ページ内での位置 -estimatedCost: number; // 预估成本(美元) -* 単一画像の分析(ドキュメントページ) -const baseDelay = 3000; // 3秒の基礎遅延 -const delay = baseDelay + Math.random() * 2000; // 3-5秒のランダムな遅延 -* 実際の画像分析を実行 -temperature: 0.1, // ランダム性を抑え、一貫性を高める -page: pageIndex ? ` (第 ${pageIndex} ページ)` : '', -throw error; // 重新抛出错误供重试机制处理 -* 再試行可能なエラーかどうかを判断 -if (errorCode === 429 || errorMessage.includes('rate limit') || errorMessage.includes('リクエストが多すぎます')) { -* 遅延関数 -* 複数画像の一括分析 -* 画像品質のチェック -return { isGood: false, reason: `ファイルが小さすぎます (${sizeKB.toFixed(2)}KB)`, score: 0 }; -return { isGood: false, reason: `ファイルが大きすぎます (${sizeKB.toFixed(2)}KB)`, score: 0 }; -* サポートされている画像ファイルかどうかを確認 -* MIME タイプを取得 -* 旧インターフェース互換:単一画像の内容を抽出 -* コスト制御およびクォータ管理サービス -* Vision Pipeline の API 呼び出しコストを管理するために使用されます -monthlyCost: number; // 今月の使用済みコスト -maxCost: number; // 月間最大コスト -remaining: number; // 残りコスト -lastReset: Date; // 最終リセット時間 -estimatedCost: number; // 推定コスト -estimatedTime: number; // 推定時間(秒) -pageBreakdown: { // ページごとの明細 -private readonly COST_PER_PAGE = 0.01; // 1ページあたりのコスト(USD) -private readonly DEFAULT_MONTHLY_LIMIT = 100; // デフォルトの月間制限(USD) -* 処理コストの推定 -const estimatedTime = pageCount * 3; // 1ページあたり約 3 秒 -* ユーザーのクォータをチェック -reason: `クォータ不足: 残り $${quota.remaining.toFixed(2)}, 必要 $${estimatedCost.toFixed(2)}`, -* クォータの差し引き -* ユーザーのクォータを取得 -throw new Error(`ユーザー ${userId} は存在しません`); -* 月間クォータのチェックとリセット -* ユーザーのクォータ制限を設定 -* コストレポートの取得 -quotaUsage: number; // パーセンテージ -* コスト警告閾値のチェック -message: `⚠️ クォータ使用率が ${usagePercent.toFixed(1)}% に達しました。残り $${quota.remaining.toFixed(2)}`, -message: `💡 クォータ使用率 ${usagePercent.toFixed(1)}%。コストの管理に注意してください`, -* コスト表示のフォーマット -* 時間表示のフォーマット -return `${seconds.toFixed(0)}秒`; -return `${minutes}分${remainingSeconds.toFixed(0)}秒`; -* Vision Pipeline サービス(コスト制御付き) -* これは vision-pipeline.service.ts の拡張版であり、コスト制御が統合されています -private costControl: CostControlService, // 新增成本控制服务 -* メイン処理フロー:Precise Mode(コスト制御付き) -this.updateStatus('converting', 10, 'ドキュメント形式を変換中...'); -this.updateStatus('splitting', 30, 'PDF を画像に変換中...'); -throw new Error('PDF から画像への変換に失敗しました。画像が生成されませんでした'); -this.updateStatus('checking', 40, 'クォータを確認し、コストを見積もり中...'); -this.updateStatus('analyzing', 50, 'ビジョンモデルを使用してページをAnalyzing...'); -this.updateStatus('completed', 100, '処理が完了しました。一時ファイルをクリーンアップ中...'); -* Vision モデル設定の取得 -throw new Error(`モデル設定が見つかりません: ${modelId}`); -* PDF への変換 -* 形式検出とモードの推奨(コスト見積もり付き) -reason: `サポートされていないファイル形式です: ${ext}`, -warnings: ['Fast Mode(テキスト抽出のみ)を使用します'], -reason: `形式 ${ext} はPrecise Modeをサポートしていません`, -reason: 'ファイルが大きいため、完全な情報を保持するためにPrecise Modeを推奨します', -warnings: ['処理時間が長くなる可能性があります', 'API 費用が発生します'], -reason: 'Precise Modeが利用可能です。テキストと画像の混合コンテンツを保持できます', -warnings: ['API 費用が発生します'], -* ユーザーのクォータ情報を取得 -* 処理状態の更新(リアルタイムフィードバック用) -* Vision Pipeline 接口定义 -duration: number; // 秒 -estimatedTime?: number; // 秒 \ No newline at end of file diff --git a/build_and_push.bat b/build_and_push.bat deleted file mode 100644 index b75e144..0000000 --- a/build_and_push.bat +++ /dev/null @@ -1,49 +0,0 @@ -@echo off -setlocal -cd /d "%~dp0" - -echo ======================================================= -echo Building and pushing to registry.cn-qingdao.aliyuncs.com/fzxs/ -echo ======================================================= - -echo. -echo ^>^> Building server image... -docker build -t registry.cn-qingdao.aliyuncs.com/fzxs/aurak-server:latest -f ./server/Dockerfile ./server -if %errorlevel% neq 0 ( - echo Server build failed! Please check if Docker is running and network is connected. - pause - exit /b %errorlevel% -) - -echo. -echo ^>^> Building web image... -docker build -t registry.cn-qingdao.aliyuncs.com/fzxs/aurak-web:latest --build-arg VITE_API_BASE_URL=/api -f ./web/Dockerfile . -if %errorlevel% neq 0 ( - echo Web build failed! Please check if Docker is running and network is connected. - pause - exit /b %errorlevel% -) - -echo. -echo ^>^> Pushing server image... -docker push registry.cn-qingdao.aliyuncs.com/fzxs/aurak-server:latest -if %errorlevel% neq 0 ( - echo Push server failed! Please check if you have logged in via: docker login --username=YOUR_USERNAME registry.cn-qingdao.aliyuncs.com - pause - exit /b %errorlevel% -) - -echo. -echo ^>^> Pushing web image... -docker push registry.cn-qingdao.aliyuncs.com/fzxs/aurak-web:latest -if %errorlevel% neq 0 ( - echo Push web failed! Please check if you have logged in to Aliyun registry. - pause - exit /b %errorlevel% -) - -echo. -echo ======================================================= -echo Images successfully built and pushed! -echo ======================================================= -pause diff --git a/build_and_push.sh b/build_and_push.sh deleted file mode 100644 index 4101cc4..0000000 --- a/build_and_push.sh +++ /dev/null @@ -1,38 +0,0 @@ -#!/bin/bash -set -e - -# 进入脚本所在目录 -cd "$(dirname "$0")" - -echo "=======================================================" -echo "开始构建并推送到 registry.cn-qingdao.aliyuncs.com/fzxs/" -echo "=======================================================" - -echo ">> 构建 server 镜像..." -if ! docker build -t registry.cn-qingdao.aliyuncs.com/fzxs/aurak-server:latest -f ./server/Dockerfile ./server; then - echo "server 构建失败!请检查 Docker 是否运行以及构建环境。" - exit 1 -fi - -echo ">> 构建 web 镜像..." -if ! docker build -t registry.cn-qingdao.aliyuncs.com/fzxs/aurak-web:latest --build-arg VITE_API_BASE_URL=/api -f ./web/Dockerfile .; then - echo "web 构建失败!请检查 Docker 是否运行以及构建环境。" - exit 1 -fi - -echo ">> 推送 server 镜像..." -if ! docker push registry.cn-qingdao.aliyuncs.com/fzxs/aurak-server:latest; then - echo "推送 server 失败!请检查是否已登录阿里云镜像仓库:" - echo "docker login --username=YOUR_USERNAME registry.cn-qingdao.aliyuncs.com" - exit 1 -fi - -echo ">> 推送 web 镜像..." -if ! docker push registry.cn-qingdao.aliyuncs.com/fzxs/aurak-web:latest; then - echo "推送 web 失败!请检查是否已登录阿里云镜像仓库:" - exit 1 -fi - -echo "=======================================================" -echo "镜像构建并推送成功!" -echo "=======================================================" diff --git a/check_all_dbs.js b/check_all_dbs.js deleted file mode 100644 index 47667c1..0000000 --- a/check_all_dbs.js +++ /dev/null @@ -1,17 +0,0 @@ -const Database = require('better-sqlite3'); - -function check(path) { - try { - const db = new Database(path); - const tableInfo = db.prepare('PRAGMA table_info(assessment_sessions)').all(); - console.log(`PATH: ${path}`); - console.log(tableInfo.map(c => c.name).join(', ')); - db.close(); - } catch (e) { - console.log(`PATH: ${path} (ERROR: ${e.message})`); - } -} - -check('d:/workspace/AuraK/server/metadata.db'); -check('d:/workspace/AuraK/data/metadata.db'); -check('d:/workspace/AuraK/server/data/metadata.db'); diff --git a/check_schema.js b/check_schema.js deleted file mode 100644 index 7ac4bad..0000000 --- a/check_schema.js +++ /dev/null @@ -1,14 +0,0 @@ -const Database = require('better-sqlite3'); -const db = new Database('d:/workspace/AuraK/server/data/metadata.db'); - -try { - const tableInfo = db.prepare('PRAGMA table_info(assessment_sessions)').all(); - console.log('TABLE INFO:'); - tableInfo.forEach(col => { - console.log(`- ${col.name} (${col.type})`); - }); -} catch (e) { - console.error(e); -} finally { - db.close(); -} diff --git a/cjk_extract.json b/cjk_extract.json deleted file mode 100644 index 3d7bf71..0000000 --- a/cjk_extract.json +++ /dev/null @@ -1,7250 +0,0 @@ -{ - "d:\\workspace\\AuraK\\web\\services\\geminiService.ts": [ - { - "line": 129, - "text": "zh: \"请始终使用Chinese回答。\"," - }, - { - "line": 131, - "text": "ja: \"常にJapaneseで答えてください。\"" - } - ], - "d:\\workspace\\AuraK\\web\\utils\\translations.ts": [ - { - "line": 6, - "text": "appTitle: \"简易知识库\"," - }, - { - "line": 7, - "text": "loginTitle: \"系统登录\"," - }, - { - "line": 8, - "text": "loginDesc: \"请输入访问密钥以进入知识库系统\"," - }, - { - "line": 9, - "text": "loginButton: \"进入系统\"," - }, - { - "line": 10, - "text": "usernamePlaceholder: \"用户名\"," - }, - { - "line": 11, - "text": "passwordPlaceholder: \"密码\"," - }, - { - "line": 12, - "text": "aiCommandsError: \"发生错误\"," - }, - { - "line": 13, - "text": "registerButton: \"注册\"," - }, - { - "line": 14, - "text": "loginError: \"密钥不能为空\"," - }, - { - "line": 15, - "text": "unknown: \"未知\"," - }, - { - "line": 16, - "text": "unknownError: \"未知错误\"," - }, - { - "line": 17, - "text": "langZh: \"语言: Chinese\"," - }, - { - "line": 18, - "text": "langEn: \"语言: English\"," - }, - { - "line": 19, - "text": "langJa: \"语言: Japanese\"," - }, - { - "line": 20, - "text": "confirm: \"确认\"," - }, - { - "line": 22, - "text": "confirmTitle: \"确认操作\"," - }, - { - "line": 23, - "text": "confirmDeleteGroup: \"Confirm要删除分组 \\\"$1\\\" 吗?\"," - }, - { - "line": 25, - "text": "sidebarTitle: \"索引与聊天配置\"," - }, - { - "line": 26, - "text": "backToWorkspace: \"返回工作台\"," - }, - { - "line": 27, - "text": "goToAdmin: \"管理后台\"," - }, - { - "line": 28, - "text": "sidebarDesc: \"管理文档与模型参数\"," - }, - { - "line": 29, - "text": "tabFiles: \"文档管理\"," - }, - { - "line": 30, - "text": "files: \"文件\"," - }, - { - "line": 31, - "text": "notes: \"笔记\"," - }, - { - "line": 32, - "text": "tabSettings: \"系统设置\"," - }, - { - "line": 33, - "text": "systemConfiguration: \"系统配置\"," - }, - { - "line": 34, - "text": "noFiles: \"暂无文件\"," - }, - { - "line": 35, - "text": "noFilesDesc: \"支持 PDF、Office 文档、文本、代码、图片等格式\"," - }, - { - "line": 36, - "text": "addFile: \"添加文件\"," - }, - { - "line": 37, - "text": "clearAll: \"清空知识库\"," - }, - { - "line": 38, - "text": "uploading: \"处理中\"," - }, - { - "line": 39, - "text": "statusIndexing: \"向量化中...\"," - }, - { - "line": 40, - "text": "statusReady: \"已索引\"," - }, - { - "line": 43, - "text": "ragSettings: \"RAG 设置\"," - }, - { - "line": 44, - "text": "enableRerank: \"启用重排序 (Rerank)\"," - }, - { - "line": 45, - "text": "enableRerankDesc: \"使用重排序模型对检索结果进行二次精排,提高准确性\"," - }, - { - "line": 46, - "text": "selectRerankModel: \"选择 Rerank 模型\"," - }, - { - "line": 47, - "text": "selectModelPlaceholder: \"请选择模型...\"," - }, - { - "line": 50, - "text": "headerModelSelection: \"模型选择\"," - }, - { - "line": 51, - "text": "headerHyperparams: \"推理参数\"," - }, - { - "line": 52, - "text": "headerIndexing: \"索引与切片\"," - }, - { - "line": 53, - "text": "headerRetrieval: \"召回与排序\"," - }, - { - "line": 54, - "text": "btnManageModels: \"管理模型供应商\"," - }, - { - "line": 56, - "text": "lblLLM: \"推理模型 (LLM)\"," - }, - { - "line": 57, - "text": "lblEmbedding: \"向量模型 (Embedding)\"," - }, - { - "line": 58, - "text": "lblRerankRef: \"重排序模型 (Rerank)\"," - }, - { - "line": 59, - "text": "lblTemperature: \"随机性 (Temperature)\"," - }, - { - "line": 60, - "text": "lblMaxTokens: \"最大输出 (Max Tokens)\"," - }, - { - "line": 61, - "text": "lblChunkSize: \"切片大小 (Tokens)\"," - }, - { - "line": 62, - "text": "lblChunkOverlap: \"重叠阈值 (Overlap)\"," - }, - { - "line": 63, - "text": "lblTopK: \"召回数量 (Top K)\"," - }, - { - "line": 64, - "text": "lblRerank: \"开启重排序 (Rerank)\"," - }, - { - "line": 67, - "text": "idxModalTitle: \"知识库分段与清洗\"," - }, - { - "line": 68, - "text": "idxDesc: \"在文件存入知识库之前,请配置分段规则和 Embedding 模型。\"," - }, - { - "line": 69, - "text": "idxFiles: \"待处理文件\"," - }, - { - "line": 70, - "text": "idxMethod: \"分段设置\"," - }, - { - "line": 71, - "text": "idxEmbeddingModel: \"Embedding 模型\"," - }, - { - "line": 72, - "text": "idxStart: \"开始索引\"," - }, - { - "line": 73, - "text": "idxCancel: \"Cancel上传\"," - }, - { - "line": 74, - "text": "idxAuto: \"自动分段\"," - }, - { - "line": 75, - "text": "idxCustom: \"自定义\"," - }, - { - "line": 78, - "text": "mmTitle: \"模型供应商管理\"," - }, - { - "line": 79, - "text": "mmAddBtn: \"添加模型\"," - }, - { - "line": 80, - "text": "mmEdit: \"编辑\"," - }, - { - "line": 81, - "text": "mmDelete: \"删除\"," - }, - { - "line": 82, - "text": "mmEmpty: \"暂无配置的模型\"," - }, - { - "line": 83, - "text": "mmFormName: \"模型别名 (显示用)\"," - }, - { - "line": 84, - "text": "mmFormProvider: \"供应商类型\"," - }, - { - "line": 85, - "text": "mmFormModelId: \"模型 ID (如 gpt-4o)\"," - }, - { - "line": 87, - "text": "mmFormType: \"模型功能类型\"," - }, - { - "line": 88, - "text": "mmFormVision: \"支持视觉能力\"," - }, - { - "line": 89, - "text": "mmFormDimensions: \"向量维度\"," - }, - { - "line": 90, - "text": "mmFormDimensionsHelp: \"嵌入向量的维度大小,常见值:1536、3072\"," - }, - { - "line": 91, - "text": "mmSave: \"保存配置\"," - }, - { - "line": 93, - "text": "mmErrorNotAuthenticated: \"未登录,无法操作\"," - }, - { - "line": 94, - "text": "mmErrorTitle: \"操作失败\"," - }, - { - "line": 95, - "text": "modelEnabled: \"模型已启用\"," - }, - { - "line": 96, - "text": "modelDisabled: \"模型已禁用\"," - }, - { - "line": 97, - "text": "confirmChangeEmbeddingModel: \"警告:更改向量模型可能导致现有索引无法搜索。\\n这将无法通过新的向量模型搜索到之前通过旧模型索引的内容。\\n是否确认更改?\"," - }, - { - "line": 98, - "text": "embeddingModelWarning: \"更改此设置可能需要清空并重新导入知识库。\"," - }, - { - "line": 99, - "text": "sourcePreview: \"引用源预览\"," - }, - { - "line": 100, - "text": "matchScore: \"匹配度\"," - }, - { - "line": 101, - "text": "copyContent: \"复制内容\"," - }, - { - "line": 102, - "text": "copySuccess: \"复制成功\"," - }, - { - "line": 104, - "text": "// ConfigPanel 缺失的翻译" - }, - { - "line": 105, - "text": "selectLLMModel: \"请选择LLM模型\"," - }, - { - "line": 106, - "text": "selectEmbeddingModel: \"请选择Embedding模型\"," - }, - { - "line": 107, - "text": "defaultForUploads: \"用于新上传和查询\"," - }, - { - "line": 108, - "text": "noRerankModel: \"无重排序模型\"," - }, - { - "line": 109, - "text": "vectorSimilarityThreshold: \"向量检索阈值\"," - }, - { - "line": 110, - "text": "rerankSimilarityThreshold: \"重排序阈值\"," - }, - { - "line": 111, - "text": "filterLowResults: \"低于此值的结果将被过滤\"," - }, - { - "line": 112, - "text": "noteCreatedSuccess: \"笔记创建成功\"," - }, - { - "line": 113, - "text": "noteCreatedFailed: \"笔记创建失败\"," - }, - { - "line": 114, - "text": "fullTextSearch: \"全文检索\"," - }, - { - "line": 115, - "text": "hybridVectorWeight: \"混合检索向量权重\"," - }, - { - "line": 116, - "text": "hybridVectorWeightDesc: \"向量平衡: 1.0 = 纯向量, 0.0 = 纯全文\"," - }, - { - "line": 117, - "text": "lblQueryExpansion: \"查询扩展 (Multi-Query)\"," - }, - { - "line": 118, - "text": "lblHyDE: \"HyDE (假设文档嵌入)\"," - }, - { - "line": 119, - "text": "lblQueryExpansionDesc: \"生成多个查询变体以提高覆盖率\"," - }, - { - "line": 120, - "text": "lblHyDEDesc: \"生成假设回答以改善语义搜索\"," - }, - { - "line": 122, - "text": "apiKeyValidationFailed: \"API Key 验证失败\"," - }, - { - "line": 123, - "text": "keepOriginalKey: \"留空保持原 API Key,输入新值则替换\"," - }, - { - "line": 124, - "text": "leaveEmptyNoChange: \"留空不修改\"," - }, - { - "line": 126, - "text": "mmFormApiKeyPlaceholder: \"请输入 API Key\"," - }, - { - "line": 128, - "text": "// 更多组件缺失的翻译" - }, - { - "line": 129, - "text": "reconfigureFile: \"重新配置文件\"," - }, - { - "line": 130, - "text": "modifySettings: \"修改文件的切片和向量化设置\"," - }, - { - "line": 132, - "text": "allFilesIndexed: \"所有文件将使用下面的设置进行索引\"," - }, - { - "line": 133, - "text": "noEmbeddingModels: \"未配置嵌入模型\"," - }, - { - "line": 134, - "text": "reconfigure: \"重新配置\"," - }, - { - "line": 135, - "text": "refresh: \"刷新\"," - }, - { - "line": 136, - "text": "settings: \"设置\"," - }, - { - "line": 137, - "text": "needLogin: \"需要登录才能使用聊天功能\"," - }, - { - "line": 138, - "text": "citationSources: \"引用源\"," - }, - { - "line": 139, - "text": "chunkNumber: \"片段\"," - }, - { - "line": 140, - "text": "getUserListFailed: \"获取用户列表失败\"," - }, - { - "line": 141, - "text": "usernamePasswordRequired: \"用户名和密码不能为空\"," - }, - { - "line": 142, - "text": "passwordMinLength: \"密码长度不能少于6位\"," - }, - { - "line": 143, - "text": "userCreatedSuccess: \"用户创建成功\"," - }, - { - "line": 144, - "text": "createUserFailed: \"创建用户失败\"," - }, - { - "line": 145, - "text": "userPromotedToAdmin: \"用户已提升为管理员\"," - }, - { - "line": 146, - "text": "userDemotedFromAdmin: \"用户已降级为普通用户\"," - }, - { - "line": 147, - "text": "updateUserFailed: \"更新用户失败\"," - }, - { - "line": 148, - "text": "confirmDeleteUser: \"Confirm要删除此用户吗?\"," - }, - { - "line": 149, - "text": "deleteUser: \"删除用户\"," - }, - { - "line": 150, - "text": "deleteUserFailed: \"删除用户失败\"," - }, - { - "line": 151, - "text": "userDeletedSuccessfully: \"用户删除成功\"," - }, - { - "line": 152, - "text": "makeUserAdmin: \"设为管理员\"," - }, - { - "line": 153, - "text": "makeUserRegular: \"设为普通用户\"," - }, - { - "line": 154, - "text": "loading: \"加载中...\"," - }, - { - "line": 155, - "text": "noUsers: \"暂无用户\"," - }, - { - "line": 157, - "text": "// ChangePasswordModal 和 SearchResultsPanel 缺失的翻译" - }, - { - "line": 158, - "text": "fillAllFields: \"请填写所有字段\"," - }, - { - "line": 159, - "text": "passwordMismatch: \"新密码和确认密码不匹配\"," - }, - { - "line": 160, - "text": "newPasswordMinLength: \"新密码长度不能少于6位\"," - }, - { - "line": 161, - "text": "changePasswordFailed: \"修改密码失败\"," - }, - { - "line": 162, - "text": "changePasswordTitle: \"修改密码\"," - }, - { - "line": 163, - "text": "changing: \"修改中...\"," - }, - { - "line": 164, - "text": "searchResults: \"搜索到的相关内容\"," - }, - { - "line": 166, - "text": "// VisionModelSelector 缺失的翻译" - }, - { - "line": 167, - "text": "visionModelSettings: \"视觉模型设置\"," - }, - { - "line": 168, - "text": "defaultVisionModel: \"默认视觉模型\"," - }, - { - "line": 169, - "text": "loadVisionModelFailed: \"加载视觉模型失败\"," - }, - { - "line": 170, - "text": "loadFailed: \"加载失败,请检查网络连接\"," - }, - { - "line": 171, - "text": "saveVisionModelFailed: \"保存视觉模型失败\"," - }, - { - "line": 172, - "text": "noVisionModels: \"没有可用的视觉模型\"," - }, - { - "line": 173, - "text": "selectVisionModel: \"请选择视觉模型\"," - }, - { - "line": 174, - "text": "visionModelHelp: \"用于处理图片文件的视觉模型。如果没有可用模型,请在模型管理中添加并勾选“支持视觉”选项。\"," - }, - { - "line": 175, - "text": "mmErrorNameRequired: \"模型名称为必填项。\"," - }, - { - "line": 176, - "text": "mmErrorModelIdRequired: \"模型 ID 为必填项。\"," - }, - { - "line": 177, - "text": "mmErrorBaseUrlRequired: \"Base URL 为必填项。\"," - }, - { - "line": 181, - "text": "typeLLM: \"对话推理 (LLM)\"," - }, - { - "line": 182, - "text": "typeEmbedding: \"向量化 (Embedding)\"," - }, - { - "line": 183, - "text": "typeRerank: \"重排序 (Rerank)\"," - }, - { - "line": 184, - "text": "typeVision: \"视觉识别 (Vision)\"," - }, - { - "line": 186, - "text": "welcome: \"你好!我是您的智能知识库助手。请在“系统设置”中选择模型,上传文档建立索引,然后即可开始提问。\"," - }, - { - "line": 187, - "text": "placeholderWithFiles: \"基于知识库内容提问...\"," - }, - { - "line": 188, - "text": "placeholderEmpty: \"请先上传文件并完成索引...\"," - }, - { - "line": 189, - "text": "analyzing: \"正在检索并生成答案...\"," - }, - { - "line": 190, - "text": "errorGeneric: \"处理您的请求时遇到错误。\"," - }, - { - "line": 191, - "text": "errorLabel: \"错误\"," - }, - { - "line": 192, - "text": "errorNoModel: \"未选择推理模型或配置无效。\"," - }, - { - "line": 193, - "text": "aiDisclaimer: \"AI 可能会犯错。请核实源文件中的重要信息。\"," - }, - { - "line": 194, - "text": "confirmClear: \"Confirm要清空所有文件及索引吗?\"," - }, - { - "line": 195, - "text": "removeFile: \"移除文件\"," - }, - { - "line": 196, - "text": "apiError: \"缺少配置或 API 密钥无效。\"," - }, - { - "line": 197, - "text": "geminiError: \"API 请求失败。\"," - }, - { - "line": 198, - "text": "processedButNoText: \"无法生成文本回复。\"," - }, - { - "line": 199, - "text": "unitByte: \"字节\"," - }, - { - "line": 200, - "text": "readingFailed: \"读取文件失败\"," - }, - { - "line": 203, - "text": "copy: \"复制内容\"," - }, - { - "line": 204, - "text": "copied: \"已复制\"," - }, - { - "line": 207, - "text": "logout: \"退出登录\"," - }, - { - "line": 208, - "text": "changePassword: \"修改密码\"," - }, - { - "line": 209, - "text": "userManagement: \"用户管理\"," - }, - { - "line": 210, - "text": "userList: \"用户列表\"," - }, - { - "line": 211, - "text": "addUser: \"新增用户\"," - }, - { - "line": 212, - "text": "username: \"用户名\"," - }, - { - "line": 213, - "text": "password: \"密码\"," - }, - { - "line": 214, - "text": "confirmPassword: \"确认密码\"," - }, - { - "line": 215, - "text": "currentPassword: \"当前密码\"," - }, - { - "line": 216, - "text": "newPassword: \"新密码\"," - }, - { - "line": 217, - "text": "createUser: \"创建用户\"," - }, - { - "line": 218, - "text": "admin: \"管理员\"," - }, - { - "line": 219, - "text": "user: \"普通用户\"," - }, - { - "line": 220, - "text": "adminUser: \"设为管理员\", // 新增," - }, - { - "line": 221, - "text": "confirmChange: \"确认修改\"," - }, - { - "line": 222, - "text": "changeUserPassword: \"修改用户密码\"," - }, - { - "line": 223, - "text": "enterNewPassword: \"请输入新密码\"," - }, - { - "line": 224, - "text": "createdAt: \"创建时间\"," - }, - { - "line": 225, - "text": "newChat: \"新建对话\"," - }, - { - "line": 228, - "text": "kbManagement: \"知识库管理\"," - }, - { - "line": 229, - "text": "kbManagementDesc: \"管理您的文档和知识分组\"," - }, - { - "line": 230, - "text": "searchPlaceholder: \"搜索文件名...\"," - }, - { - "line": 231, - "text": "allGroups: \"所有分组\"," - }, - { - "line": 232, - "text": "allStatus: \"所有状态\"," - }, - { - "line": 236, - "text": "uploadFile: \"上传文件\"," - }, - { - "line": 237, - "text": "fileName: \"文件名\"," - }, - { - "line": 238, - "text": "size: \"大小\"," - }, - { - "line": 239, - "text": "status: \"状态\"," - }, - { - "line": 240, - "text": "groups: \"分组\"," - }, - { - "line": 241, - "text": "actions: \"操作\"," - }, - { - "line": 242, - "text": "groupsActions: \"分组 / 操作\"," - }, - { - "line": 243, - "text": "noFilesFound: \"未找到匹配的文件\"," - }, - { - "line": 244, - "text": "showingRange: \"显示 $1 到 $2 条,共 $3 条\"," - }, - { - "line": 245, - "text": "confirmDeleteFile: \"Confirm要删除此文件吗?\"," - }, - { - "line": 246, - "text": "fileDeleted: \"文件已删除\"," - }, - { - "line": 247, - "text": "deleteFailed: \"删除失败\"," - }, - { - "line": 248, - "text": "fileAddedToGroup: \"文件已添加到分组\"," - }, - { - "line": 249, - "text": "failedToAddToGroup: \"添加到分组失败\"," - }, - { - "line": 250, - "text": "fileRemovedFromGroup: \"文件已从分组移除\"," - }, - { - "line": 251, - "text": "failedToRemoveFromGroup: \"从分组移除失败\"," - }, - { - "line": 252, - "text": "confirmClearKB: \"警告:此操作将永久删除所有文件及其索引数据。\\n\\nConfirm要清空知识库吗?\"," - }, - { - "line": 253, - "text": "kbCleared: \"知识库已清空\"," - }, - { - "line": 254, - "text": "clearFailed: \"清空失败\"," - }, - { - "line": 255, - "text": "loginRequired: \"请先登录\"," - }, - { - "line": 256, - "text": "uploadErrors: \"以下文件无法上传\"," - }, - { - "line": 257, - "text": "uploadWarning: \"$1 files已准备上传,$2 files被过滤\"," - }, - { - "line": 258, - "text": "uploadFailed: \"上传失败\"," - }, - { - "line": 259, - "text": "preview: \"预览\"," - }, - { - "line": 260, - "text": "addGroup: \"添加分组\"," - }, - { - "line": 261, - "text": "delete: \"删除\"," - }, - { - "line": 262, - "text": "retry: \"重试\"," - }, - { - "line": 263, - "text": "retrying: \"重试中...\"," - }, - { - "line": 264, - "text": "retrySuccess: \"重试成功\"," - }, - { - "line": 265, - "text": "retryFailed: \"重试失败\"," - }, - { - "line": 266, - "text": "chunkInfo: \"分片信息\"," - }, - { - "line": 267, - "text": "totalChunks: \"总分片数\"," - }, - { - "line": 268, - "text": "chunkIndex: \"分片\"," - }, - { - "line": 269, - "text": "contentLength: \"字符\"," - }, - { - "line": 270, - "text": "position: \"位置\"," - }, - { - "line": 273, - "text": "reconfigureTitle: \"重新配置文件\"," - }, - { - "line": 274, - "text": "reconfigureDesc: \"修改文件处理设置\"," - }, - { - "line": 275, - "text": "indexingConfigTitle: \"文档索引配置\"," - }, - { - "line": 276, - "text": "indexingConfigDesc: \"配置文档处理参数,选择处理模式\"," - }, - { - "line": 277, - "text": "pendingFiles: \"待处理文件\"," - }, - { - "line": 278, - "text": "processingMode: \"处理模式\"," - }, - { - "line": 280, - "text": "recommendationReason: \"推荐理由\"," - }, - { - "line": 281, - "text": "fastMode: \"快速模式\"," - }, - { - "line": 282, - "text": "fastModeDesc: \"简单提取文本,速度快,无额外成本,适合纯文本文档\"," - }, - { - "line": 283, - "text": "preciseMode: \"精准模式\"," - }, - { - "line": 284, - "text": "preciseModeDesc: \"精准识别内容,保留图文混合信息,需要 API 费用\"," - }, - { - "line": 285, - "text": "fastModeFeatures: \"快速模式特点:\"," - }, - { - "line": 286, - "text": "fastFeature1: \"简单提取文本内容\"," - }, - { - "line": 287, - "text": "fastFeature2: \"处理速度快,适合批量处理\"," - }, - { - "line": 288, - "text": "fastFeature3: \"无额外成本\"," - }, - { - "line": 289, - "text": "fastFeature4: \"仅处理文字信息\"," - }, - { - "line": 290, - "text": "fastFeature5: \"适合纯文本文档\"," - }, - { - "line": 291, - "text": "preciseModeFeatures: \"精准模式特点:\"," - }, - { - "line": 292, - "text": "preciseFeature1: \"精准识别内容结构\"," - }, - { - "line": 293, - "text": "preciseFeature2: \"识别图片/图表/表格\"," - }, - { - "line": 294, - "text": "preciseFeature3: \"保留图文混合内容\"," - }, - { - "line": 295, - "text": "preciseFeature4: \"保留页面布局信息\"," - }, - { - "line": 296, - "text": "preciseFeature5: \"需要 API 费用\"," - }, - { - "line": 297, - "text": "preciseFeature6: \"处理时间较长\"," - }, - { - "line": 298, - "text": "embeddingModel: \"嵌入模型\"," - }, - { - "line": 299, - "text": "pleaseSelect: \"请选择...\"," - }, - { - "line": 300, - "text": "pleaseSelectKnowledgeGroupFirst: \"请先选择知识组再保存\"," - }, - { - "line": 301, - "text": "selectUnassignGroupWarning: \"如果您想Cancel分配知识组,请确认此操作\"," - }, - { - "line": 302, - "text": "chunkConfig: \"切片配置\"," - }, - { - "line": 303, - "text": "chunkSize: \"切片大小 (Tokens)\"," - }, - { - "line": 304, - "text": "min: \"最小\"," - }, - { - "line": 305, - "text": "max: \"上限\"," - }, - { - "line": 306, - "text": "chunkOverlap: \"重叠大小 (Tokens)\"," - }, - { - "line": 307, - "text": "modelLimitsInfo: \"模型限制信息\"," - }, - { - "line": 308, - "text": "model: \"模型\"," - }, - { - "line": 309, - "text": "maxChunkSize: \"切片上限\"," - }, - { - "line": 310, - "text": "maxOverlapSize: \"重叠上限\"," - }, - { - "line": 311, - "text": "maxBatchSize: \"批量限制\"," - }, - { - "line": 312, - "text": "envLimitWeaker: \"环境变量限制更严格\"," - }, - { - "line": 313, - "text": "optimizationTips: \"优化建议\"," - }, - { - "line": 314, - "text": "tipChunkTooLarge: \"切片较大,可能影响检索精度\"," - }, - { - "line": 315, - "text": "tipOverlapSmall: \"建议重叠至少 $1 tokens\"," - }, - { - "line": 316, - "text": "tipMaxValues: \"使用最大值,处理速度可能较慢\"," - }, - { - "line": 317, - "text": "tipPreciseCost: \"精准模式会产生 API 费用,请确认预算\"," - }, - { - "line": 318, - "text": "selectEmbeddingFirst: \"请先选择嵌入模型\"," - }, - { - "line": 319, - "text": "confirmPreciseCost: \"精准模式会产生 API 费用,是否继续?\"," - }, - { - "line": 320, - "text": "startProcessing: \"开始处理\"," - }, - { - "line": 323, - "text": "notebooks: \"知识组\"," - }, - { - "line": 324, - "text": "notebooksDesc: \"管理您的文档和知识分组\"," - }, - { - "line": 325, - "text": "createNotebook: \"新建知识组\"," - }, - { - "line": 326, - "text": "chatWithNotebook: \"基于此知识组对话\"," - }, - { - "line": 327, - "text": "editNotebook: \"编辑知识组\"," - }, - { - "line": 328, - "text": "deleteNotebook: \"删除知识组 (包含文件)\"," - }, - { - "line": 329, - "text": "noDescription: \"无描述\"," - }, - { - "line": 330, - "text": "noNotebooks: \"暂无知识组,点击右上角创建\"," - }, - { - "line": 331, - "text": "createFailed: \"创建失败\"," - }, - { - "line": 332, - "text": "confirmDeleteNotebook: \"Confirm要删除知识组 \\\"$1\\\" 吗?\\n\\n注意:这将同时永久删除该知识组下的所有文件及其索引数据!\"," - }, - { - "line": 336, - "text": "personalNotebookDesc: \"记录您的个人笔记与灵感\"," - }, - { - "line": 337, - "text": "noNotes: \"暂无个人笔记\"," - }, - { - "line": 338, - "text": "createNote: \"新建笔记\"," - }, - { - "line": 341, - "text": "createNotebookTitle: \"新建知识组\"," - }, - { - "line": 342, - "text": "editNotebookTitle: \"编辑知识组\"," - }, - { - "line": 343, - "text": "createFailedRetry: \"创建失败,请重试\"," - }, - { - "line": 344, - "text": "updateFailedRetry: \"更新失败,请重试\"," - }, - { - "line": 345, - "text": "name: \"名称\"," - }, - { - "line": 346, - "text": "nameHelp: \"一个清晰的名称能帮你快速找到它。\"," - }, - { - "line": 347, - "text": "namePlaceholder: \"例如:量子物理研究...\"," - }, - { - "line": 348, - "text": "shortDescription: \"简短描述\"," - }, - { - "line": 349, - "text": "descPlaceholder: \"一句话描述这个知识组的用途\"," - }, - { - "line": 350, - "text": "creating: \"正在创建...\"," - }, - { - "line": 351, - "text": "createNow: \"立即创建\"," - }, - { - "line": 352, - "text": "saving: \"正在保存...\"," - }, - { - "line": 353, - "text": "save: \"保存\"," - }, - { - "line": 356, - "text": "chatTitle: \"知识库问答\"," - }, - { - "line": 357, - "text": "chatDesc: \"与您的知识库进行智能对话\"," - }, - { - "line": 358, - "text": "viewHistory: \"查看对话历史\"," - }, - { - "line": 359, - "text": "saveSettingsFailed: \"保存设置失败\"," - }, - { - "line": 360, - "text": "loginToUpload: \"请先登录再进行上传\"," - }, - { - "line": 361, - "text": "fileSizeLimitExceeded: \"$1 ($2 - 超过 $3MB 限制)\"," - }, - { - "line": 362, - "text": "unsupportedFileType: \"$1 - 不支持的文件类型 ($2)\"," - }, - { - "line": 363, - "text": "readFailed: \"$1 - 读取失败\"," - }, - { - "line": 364, - "text": "loadHistoryFailed: \"加载对话历史失败\"," - }, - { - "line": 365, - "text": "loadingUserData: \"正在加载用户数据...\"," - }, - { - "line": 366, - "text": "errorMessage: \"错误: $1\"," - }, - { - "line": 367, - "text": "welcomeMessage: \"你好!我是您的智能知识库助手。请选择知识库然后进行提问。\"," - }, - { - "line": 368, - "text": "selectKnowledgeGroup: \"选择知识库分组\"," - }, - { - "line": 369, - "text": "allKnowledgeGroups: \"全部知识库\"," - }, - { - "line": 370, - "text": "unknownGroup: \"未知分组\"," - }, - { - "line": 374, - "text": "generalSettings: \"一般配置\"," - }, - { - "line": 375, - "text": "modelManagement: \"模型管理\"," - }, - { - "line": 376, - "text": "languageSettings: \"语言设置\"," - }, - { - "line": 377, - "text": "passwordChangeSuccess: \"密码修改成功\"," - }, - { - "line": 378, - "text": "passwordChangeFailed: \"密码修改失败\"," - }, - { - "line": 379, - "text": "create: \"创建\"," - }, - { - "line": 383, - "text": "navChat: \"对话\"," - }, - { - "line": 384, - "text": "navCoach: \"教练\"," - }, - { - "line": 385, - "text": "navKnowledge: \"知识库\"," - }, - { - "line": 386, - "text": "navKnowledgeGroups: \"知识组\"," - }, - { - "line": 387, - "text": "navNotebook: \"笔记本\"," - }, - { - "line": 388, - "text": "navAgent: \"智能体\"," - }, - { - "line": 389, - "text": "navPlugin: \"插件\"," - }, - { - "line": 390, - "text": "notebookDesc: \"记录您的个人想法和研究笔记。\"," - }, - { - "line": 391, - "text": "newNote: \"新建笔记\"," - }, - { - "line": 392, - "text": "editNote: \"编辑笔记\"," - }, - { - "line": 393, - "text": "noNotesFound: \"未找到笔记\"," - }, - { - "line": 394, - "text": "startByCreatingNote: \"开始创建您的第一条个人笔记。\"," - }, - { - "line": 395, - "text": "navCrawler: \"资源获取\"," - }, - { - "line": 396, - "text": "expandMenu: \"展开菜单\"," - }, - { - "line": 397, - "text": "switchLanguage: \"切换语言\"," - }, - { - "line": 398, - "text": "navGlobal: \"全局\"," - }, - { - "line": 399, - "text": "navTenants: \"租户管理\"," - }, - { - "line": 400, - "text": "navSystemModels: \"系统模型\"," - }, - { - "line": 401, - "text": "navTenantManagement: \"租户管理\"," - }, - { - "line": 402, - "text": "navUsersTeam: \"用户与团队\"," - }, - { - "line": 403, - "text": "navTenantSettings: \"租户设置\"," - }, - { - "line": 404, - "text": "adminConsole: \"管理控制台\"," - }, - { - "line": 405, - "text": "globalDashboard: \"全局仪表盘\"," - }, - { - "line": 408, - "text": "selectKnowledgeGroups: \"选择知识库分组\"," - }, - { - "line": 410, - "text": "done: \"完成\"," - }, - { - "line": 411, - "text": "all: \"全部\"," - }, - { - "line": 416, - "text": "autoRefresh: \"自动刷新\"," - }, - { - "line": 417, - "text": "refreshInterval: \"刷新间隔\"," - }, - { - "line": 420, - "text": "errorRenderFlowchart: \"无法渲染流程图\"," - }, - { - "line": 421, - "text": "errorLoadData: \"加载数据失败\"," - }, - { - "line": 422, - "text": "confirmUnsupportedFile: \"文件类型 .$1 可能不受支持,是否继续?\"," - }, - { - "line": 423, - "text": "errorReadFile: \"文件读取失败: $1\"," - }, - { - "line": 424, - "text": "successUploadFile: \"文件上传并关联成功\"," - }, - { - "line": 425, - "text": "errorUploadFile: \"上传失败: $1\"," - }, - { - "line": 426, - "text": "errorProcessFile: \"文件处理失败\"," - }, - { - "line": 427, - "text": "errorTitleContentRequired: \"标题和内容不能为空\"," - }, - { - "line": 428, - "text": "successNoteUpdated: \"笔记已更新\"," - }, - { - "line": 429, - "text": "successNoteCreated: \"笔记已创建\"," - }, - { - "line": 430, - "text": "errorSaveFailed: \"保存失败: $1\"," - }, - { - "line": 431, - "text": "confirmDeleteNote: \"Confirm要删除这条笔记吗?\"," - }, - { - "line": 432, - "text": "successNoteDeleted: \"笔记已删除\"," - }, - { - "line": 433, - "text": "confirmRemoveFileFromGroup: \"Confirm要将文件 \\\"$1\\\" 从此知识组移除吗?(文件仍保留在知识库中)\"," - }, - { - "line": 434, - "text": "togglePreviewOpen: \"开启预览\"," - }, - { - "line": 435, - "text": "togglePreviewClose: \"关闭预览\"," - }, - { - "line": 436, - "text": "aiAssistant: \"AI 智能助手\"," - }, - { - "line": 437, - "text": "polishContent: \"润色内容\"," - }, - { - "line": 438, - "text": "expandContent: \"扩写\"," - }, - { - "line": 439, - "text": "summarizeContent: \"精简摘要\"," - }, - { - "line": 440, - "text": "translateToEnglish: \"翻译成英文\"," - }, - { - "line": 441, - "text": "fixGrammar: \"修复语法\"," - }, - { - "line": 442, - "text": "aiCommandInstructPolish: \"请帮我润色这段文字,使其表达更地道、更专业。\"," - }, - { - "line": 443, - "text": "aiCommandInstructExpand: \"请帮我扩写这段文字,增加更多细节,使其更充实和详细。\"," - }, - { - "line": 444, - "text": "aiCommandInstructSummarize: \"请帮我精简这段文字,提取核心观点,生成简洁的摘要。\"," - }, - { - "line": 445, - "text": "aiCommandInstructTranslateToEn: \"请帮我将这段文字翻译成英文。\"," - }, - { - "line": 446, - "text": "aiCommandInstructFixGrammar: \"请检查并修复这段文字中的语法和拼写错误。\"," - }, - { - "line": 447, - "text": "aiCommandsPreset: \"常用指令\"," - }, - { - "line": 448, - "text": "aiCommandsCustom: \"自定义需求\"," - }, - { - "line": 449, - "text": "aiCommandsCustomPlaceholder: \"例如:把这段话改写得更正式一点...\"," - }, - { - "line": 450, - "text": "aiCommandsReferenceContext: \"参考上下文 (前200字):\"," - }, - { - "line": 451, - "text": "aiCommandsStartGeneration: \"开始生成\"," - }, - { - "line": 452, - "text": "aiCommandsResult: \"AI 建议\"," - }, - { - "line": 453, - "text": "aiCommandsGenerating: \"生成中...\"," - }, - { - "line": 454, - "text": "aiCommandsApplyResult: \"替换选区\"," - }, - { - "line": 455, - "text": "aiCommandsGoBack: \"返回修改\"," - }, - { - "line": 456, - "text": "aiCommandsReset: \"清空重置\"," - }, - { - "line": 457, - "text": "aiCommandsModalPreset: \"选择预设指令\"," - }, - { - "line": 458, - "text": "aiCommandsModalCustom: \"或输入自定义指令\"," - }, - { - "line": 459, - "text": "aiCommandsModalCustomPlaceholder: \"告诉 AI 你想做什么...\"," - }, - { - "line": 460, - "text": "aiCommandsModalBasedOnSelection: \"将基于以下选Chinese本处理:\"," - }, - { - "line": 461, - "text": "aiCommandsModalResult: \"生成结果\"," - }, - { - "line": 462, - "text": "aiCommandsModalApply: \"采用此结果\"," - }, - { - "line": 463, - "text": "noteTitlePlaceholder: \"笔记标题\"," - }, - { - "line": 464, - "text": "noteContentPlaceholder: \"开始写作 (支持 Markdown)...\"," - }, - { - "line": 465, - "text": "markdownPreviewArea: \"Markdown 预览区域\"," - }, - { - "line": 466, - "text": "back: \"返回\"," - }, - { - "line": 467, - "text": "chatWithGroup: \"基于此知识组进行对话\"," - }, - { - "line": 468, - "text": "chatWithFile: \"基于此文件进行对话\"," - }, - { - "line": 469, - "text": "filesCountLabel: \"文件 ($1)\"," - }, - { - "line": 470, - "text": "notesCountLabel: \"笔记 ($1)\"," - }, - { - "line": 471, - "text": "indexIntoKB: \"索引到知识库\"," - }, - { - "line": 472, - "text": "noFilesOrNotes: \"暂无$1\"," - }, - { - "line": 473, - "text": "importFolder: \"导入文件夹\"," - }, - { - "line": 476, - "text": "createPDFNote: \"创建PDF笔记\"," - }, - { - "line": 477, - "text": "screenshotPreview: \"截图预览\"," - }, - { - "line": 478, - "text": "associateKnowledgeGroup: \"关联知识组\"," - }, - { - "line": 479, - "text": "globalNoSpecificGroup: \"全局 (无特定知识组)\"," - }, - { - "line": 480, - "text": "title: \"标题\"," - }, - { - "line": 481, - "text": "enterNoteTitle: \"输入笔记标题\"," - }, - { - "line": 482, - "text": "contentOCR: \"内容 (OCR提取的文本)\"," - }, - { - "line": 483, - "text": "extractingText: \"正在提取文本...\"," - }, - { - "line": 484, - "text": "analyzingImage: \"正在分析图片并提取文字...\"," - }, - { - "line": 485, - "text": "noTextExtracted: \"未提取到文本\"," - }, - { - "line": 486, - "text": "saveNote: \"保存笔记\"," - }, - { - "line": 489, - "text": "page: \"第\"," - }, - { - "line": 490, - "text": "placeholderText: \"OCR提取的文本将显示在这里,您可以编辑...\"," - }, - { - "line": 493, - "text": "createNewNotebook: \"新建知识组\"," - }, - { - "line": 494, - "text": "nameField: \"名称\"," - }, - { - "line": 496, - "text": "exampleResearch: \"例如:量子物理研究...\"," - }, - { - "line": 497, - "text": "shortDescriptionField: \"简短描述\"," - }, - { - "line": 498, - "text": "describePurpose: \"一句话描述这个知识组的用途\"," - }, - { - "line": 499, - "text": "creationFailed: \"创建失败,请重试\"," - }, - { - "line": 502, - "text": "preparingPDFConversion: \"准备转换PDF...\"," - }, - { - "line": 503, - "text": "pleaseWait: \"请稍候,这可能需要几分钟时间\"," - }, - { - "line": 504, - "text": "convertingPDF: \"正在转换PDF...\"," - }, - { - "line": 505, - "text": "pdfConversionFailed: \"PDF转换失败\"," - }, - { - "line": 506, - "text": "pdfConversionError: \"无法转换此文件为PDF格式,请检查文件是否损坏或格式不支持\"," - }, - { - "line": 507, - "text": "pdfLoadFailed: \"PDF加载失败\"," - }, - { - "line": 508, - "text": "pdfLoadError: \"无法在浏览器中显示PDF,请尝试下载或在新窗口中打开\"," - }, - { - "line": 509, - "text": "downloadingPDF: \"下载PDF中...\"," - }, - { - "line": 510, - "text": "loadingPDF: \"加载PDF中...\"," - }, - { - "line": 511, - "text": "zoomOut: \"缩小\"," - }, - { - "line": 512, - "text": "zoomIn: \"放大\"," - }, - { - "line": 513, - "text": "resetZoom: \"重置缩放\"," - }, - { - "line": 514, - "text": "selectPageNumber: \"选择页码:\"," - }, - { - "line": 515, - "text": "enterPageNumber: \"输入想要选取的页码\"," - }, - { - "line": 516, - "text": "exitSelectionMode: \"退出选择模式\"," - }, - { - "line": 517, - "text": "clickToSelectAndNote: \"点击框选区域并记笔记\"," - }, - { - "line": 518, - "text": "regeneratePDF: \"重新生成 PDF\"," - }, - { - "line": 519, - "text": "downloadPDF: \"下载 PDF\"," - }, - { - "line": 520, - "text": "openInNewWindow: \"在新窗口中打开\"," - }, - { - "line": 521, - "text": "exitFullscreen: \"退出全屏\"," - }, - { - "line": 522, - "text": "fullscreenDisplay: \"全屏显示\"," - }, - { - "line": 523, - "text": "pdfPreview: \"PDF预览\"," - }, - { - "line": 524, - "text": "converting: \"转换中...\"," - }, - { - "line": 525, - "text": "generatePDFPreview: \"生成PDF预览\"," - }, - { - "line": 526, - "text": "previewNotSupported: \"该格式不支持预览\"," - }, - { - "line": 529, - "text": "confirmRegeneratePDF: \"Confirm要重新生成 PDF 吗?这将覆盖当前的预览文件。\"," - }, - { - "line": 532, - "text": "pdfPreviewReady: \"PDF预览\"," - }, - { - "line": 533, - "text": "convertingInProgress: \"转换中...\"," - }, - { - "line": 534, - "text": "conversionFailed: \"转换失败\"," - }, - { - "line": 535, - "text": "generatePDFPreviewButton: \"生成PDF预览\"," - }, - { - "line": 539, - "text": "requestRegenerationFailed: \"请求重新生成失败\"," - }, - { - "line": 540, - "text": "downloadPDFFailed: \"PDF 下载失败\"," - }, - { - "line": 541, - "text": "openPDFInNewTabFailed: \"在新标签页打开 PDF 失败\"," - }, - { - "line": 544, - "text": "invalidFile: \"无效的文件\"," - }, - { - "line": 545, - "text": "incompleteFileInfo: \"文件信息不完整,将使用快速模式\"," - }, - { - "line": 546, - "text": "unsupportedFileFormat: \"不支持的文件格式: .$1\"," - }, - { - "line": 547, - "text": "willUseFastMode: \"将使用快速模式 (仅文本提取)\"," - }, - { - "line": 548, - "text": "formatNoPrecise: \"格式 .$1 不支持精准模式\"," - }, - { - "line": 549, - "text": "smallFileFastOk: \"文件较小,快速模式即可满足需求\"," - }, - { - "line": 550, - "text": "mixedContentPreciseRecommended: \"文件包含图文混合内容,建议使用精准模式\"," - }, - { - "line": 551, - "text": "willIncurApiCost: \"会产生 API 费用\"," - }, - { - "line": 552, - "text": "largeFilePreciseRecommended: \"文件较大,精准模式可保留完整信息\"," - }, - { - "line": 553, - "text": "longProcessingTime: \"处理时间可能较长\"," - }, - { - "line": 554, - "text": "highApiCost: \"会产生较高 API 费用\"," - }, - { - "line": 555, - "text": "considerFileSplitting: \"建议考虑文件拆分\"," - }, - { - "line": 558, - "text": "dragDropUploadTitle: \"拖拽文件到这里上传\"," - }, - { - "line": 559, - "text": "dragDropUploadDesc: \"或点击下方按钮选择文件\"," - }, - { - "line": 560, - "text": "supportedFormats: \"支持格式\"," - }, - { - "line": 561, - "text": "browseFiles: \"浏览文件\"," - }, - { - "line": 564, - "text": "recommendationMsg: \"推荐使用$1模式: $2\"," - }, - { - "line": 565, - "text": "autoAdjustChunk: \"切片大小自动调整为上限 $1\"," - }, - { - "line": 566, - "text": "autoAdjustOverlap: \"重叠大小自动调整为上限 $1\"," - }, - { - "line": 567, - "text": "autoAdjustOverlapMin: \"重叠大小自动调整为最小值 $1\"," - }, - { - "line": 568, - "text": "loadLimitsFailed: \"无法加载模型限制,将使用默认配置\"," - }, - { - "line": 569, - "text": "maxValueMsg: \"最大值为 $1\"," - }, - { - "line": 570, - "text": "overlapRatioLimit: \"不能超过切片大小的50% ($1)\"," - }, - { - "line": 571, - "text": "onlyAdminCanModify: \"只有管理员可以修改系统设置\"," - }, - { - "line": 572, - "text": "dragToSelect: \"拖动鼠标选择范围 • 按 ESC Cancel\"," - }, - { - "line": 575, - "text": "fillTargetName: \"请填写目标知识组名称\"," - }, - { - "line": 576, - "text": "submitFailed: \"提交失败: $1\"," - }, - { - "line": 577, - "text": "importFolderTitle: \"导入本地文件夹\"," - }, - { - "line": 578, - "text": "importFolderTip: \"提示: 请选择一个本地文件夹。系统将读取并上传文件夹内所有支持的文档。\"," - }, - { - "line": 579, - "text": "lblTargetGroup: \"目标知识组名称\"," - }, - { - "line": 580, - "text": "placeholderNewGroup: \"新分组名称\"," - }, - { - "line": 581, - "text": "importToCurrentGroup: \"将导入到当前所在的分组\"," - }, - { - "line": 582, - "text": "nextStep: \"下一步\"," - }, - { - "line": 583, - "text": "selectedFilesCount: \"已选择 $1 files\"," - }, - { - "line": 584, - "text": "clickToSelectFolder: \"点击选择本地文件夹\"," - }, - { - "line": 585, - "text": "selectFolderTip: \"将读取文件夹内所有支持的文件\"," - }, - { - "line": 586, - "text": "importComplete: \"导入完成\"," - }, - { - "line": 587, - "text": "importedFromLocalFolder: \"从本地文件夹导入: $1\"," - }, - { - "line": 590, - "text": "historyTitle: \"对话历史\"," - }, - { - "line": 591, - "text": "confirmDeleteHistory: \"Confirm要删除这条对话历史吗?\"," - }, - { - "line": 592, - "text": "deleteHistorySuccess: \"对话历史删除成功\"," - }, - { - "line": 593, - "text": "deleteHistoryFailed: \"删除对话历史失败\"," - }, - { - "line": 594, - "text": "yesterday: \"昨天\"," - }, - { - "line": 595, - "text": "daysAgo: \"$1天前\"," - }, - { - "line": 596, - "text": "historyMessages: \"$1 条消息\"," - }, - { - "line": 597, - "text": "noHistory: \"暂无对话历史\"," - }, - { - "line": 598, - "text": "noHistoryDesc: \"开始一次对话来创建历史记录\"," - }, - { - "line": 599, - "text": "loadMore: \"加载更多\"," - }, - { - "line": 600, - "text": "loadingHistoriesFailed: \"加载搜索历史失败\"," - }, - { - "line": 601, - "text": "generalSettingsSubtitle: \"管理您的应用程序首选项。\"," - }, - { - "line": 602, - "text": "userManagementSubtitle: \"管理访问权限和帐户。\"," - }, - { - "line": 603, - "text": "modelManagementSubtitle: \"配置全局 AI 模型。\"," - }, - { - "line": 604, - "text": "kbSettingsSubtitle: \"索引和聊天参数的技术配置。\"," - }, - { - "line": 605, - "text": "tenantsSubtitle: \"全局系统概览。\"," - }, - { - "line": 607, - "text": "allNotes: \"所有笔记\"," - }, - { - "line": 608, - "text": "filterNotesPlaceholder: \"筛选笔记...\"," - }, - { - "line": 609, - "text": "startWritingPlaceholder: \"开始写作...\"," - }, - { - "line": 610, - "text": "previewHeader: \"预览\"," - }, - { - "line": 611, - "text": "noContentToPreview: \"没有可预览的内容\"," - }, - { - "line": 612, - "text": "hidePreview: \"隐藏预览\"," - }, - { - "line": 613, - "text": "showPreview: \"显示预览\"," - }, - { - "line": 614, - "text": "directoryLabel: \"目录\"," - }, - { - "line": 615, - "text": "uncategorized: \"未分类\"," - }, - { - "line": 616, - "text": "enterNamePlaceholder: \"输入名称...\"," - }, - { - "line": 617, - "text": "subFolderPlaceholder: \"子文件夹...\"," - }, - { - "line": 618, - "text": "categoryCreated: \"分类已创建\"," - }, - { - "line": 619, - "text": "failedToCreateCategory: \"创建分类失败\"," - }, - { - "line": 620, - "text": "failedToDeleteCategory: \"删除分类失败\"," - }, - { - "line": 621, - "text": "confirmDeleteCategory: \"您Confirm要删除此分类吗?\"," - }, - { - "line": 622, - "text": "kbSettingsSaved: \"检索与对话配置已保存\"," - }, - { - "line": 623, - "text": "failedToSaveSettings: \"保存设置失败\"," - }, - { - "line": 624, - "text": "actionFailed: \"操作失败\"," - }, - { - "line": 625, - "text": "userAddedToOrganization: \"用户已添加到组织\"," - }, - { - "line": 626, - "text": "featureUpdated: \"功能已更新\"," - }, - { - "line": 627, - "text": "roleTenantAdmin: \"租户管理员\"," - }, - { - "line": 628, - "text": "roleRegularUser: \"普通用户\"," - }, - { - "line": 629, - "text": "creatingRegularUser: \"正在创建普通用户\"," - }, - { - "line": 630, - "text": "editUserRole: \"修改用户角色\"," - }, - { - "line": 631, - "text": "targetRole: \"目标角色\"," - }, - { - "line": 632, - "text": "editCategory: \"编辑分类\"," - }, - { - "line": 633, - "text": "totalTenants: \"总租户数\"," - }, - { - "line": 634, - "text": "systemUsers: \"系统用户\"," - }, - { - "line": 635, - "text": "systemHealth: \"系统健康\"," - }, - { - "line": 636, - "text": "operational: \"运行正常\"," - }, - { - "line": 637, - "text": "orgManagement: \"组织管理\"," - }, - { - "line": 638, - "text": "globalTenantControl: \"全局租户控制\"," - }, - { - "line": 639, - "text": "newTenant: \"新租户\"," - }, - { - "line": 640, - "text": "domainOptional: \"域名 (可选)\"," - }, - { - "line": 641, - "text": "saveChanges: \"保存修改\"," - }, - { - "line": 642, - "text": "modelConfiguration: \"模型配置\"," - }, - { - "line": 643, - "text": "defaultLLMModel: \"默认推理模型\"," - }, - { - "line": 644, - "text": "selectLLM: \"选择 LLM\"," - }, - { - "line": 645, - "text": "selectEmbedding: \"选择 Embedding\"," - }, - { - "line": 646, - "text": "rerankModel: \"Rerank 模型\"," - }, - { - "line": 647, - "text": "none: \"无\"," - }, - { - "line": 648, - "text": "indexingChunkingConfig: \"索引与切片配置\"," - }, - { - "line": 649, - "text": "chatHyperparameters: \"聊天超参数\"," - }, - { - "line": 650, - "text": "temperature: \"随机性 (Temperature)\"," - }, - { - "line": 651, - "text": "precise: \"精确\"," - }, - { - "line": 652, - "text": "creative: \"创意\"," - }, - { - "line": 653, - "text": "maxResponseTokens: \"最大响应标识 (Max Tokens)\"," - }, - { - "line": 654, - "text": "retrievalSearchSettings: \"检索与搜索设置\"," - }, - { - "line": 655, - "text": "topK: \"召回数量 (Top K)\"," - }, - { - "line": 656, - "text": "similarityThreshold: \"相似度阈值\"," - }, - { - "line": 657, - "text": "enableHybridSearch: \"启用混合检索\"," - }, - { - "line": 658, - "text": "hybridSearchDesc: \"同时使用向量和全文检索以提高召回率\"," - }, - { - "line": 659, - "text": "hybridWeight: \"混合权重 (0.0=全文, 1.0=向量)\"," - }, - { - "line": 660, - "text": "pureText: \"纯文本\"," - }, - { - "line": 661, - "text": "pureVector: \"纯向量\"," - }, - { - "line": 662, - "text": "enableQueryExpansion: \"启用查询扩展\"," - }, - { - "line": 663, - "text": "queryExpansionDesc: \"生成多个查询变体以提高覆盖率\"," - }, - { - "line": 664, - "text": "enableHyDE: \"启用 HyDE\"," - }, - { - "line": 665, - "text": "hydeDesc: \"生成假设回答以改善语义搜索\"," - }, - { - "line": 666, - "text": "enableReranking: \"启用重排序 (Rerank)\"," - }, - { - "line": 667, - "text": "rerankingDesc: \"使用 Rerank 模型对结果进行二次排序\"," - }, - { - "line": 668, - "text": "broad: \"宽泛\"," - }, - { - "line": 669, - "text": "strict: \"严格\"," - }, - { - "line": 670, - "text": "maxInput: \"最大输入\"," - }, - { - "line": 671, - "text": "dimensions: \"维度\"," - }, - { - "line": 672, - "text": "defaultBadge: \"默认\"," - }, - { - "line": 673, - "text": "dims: \"维度: $1\"," - }, - { - "line": 674, - "text": "ctx: \"上下文: $1\"," - }, - { - "line": 676, - "text": "configured: \"已配置\"," - }, - { - "line": 677, - "text": "groupUpdated: \"分组已更新\"," - }, - { - "line": 678, - "text": "groupDeleted: \"分组已删除\"," - }, - { - "line": 679, - "text": "groupCreated: \"分组已创建\"," - }, - { - "line": 680, - "text": "navCatalog: \"目录\"," - }, - { - "line": 681, - "text": "allDocuments: \"所有文档\"," - }, - { - "line": 682, - "text": "categories: \"分类\"," - }, - { - "line": 683, - "text": "uncategorizedFiles: \"未分类文件\"," - }, - { - "line": 684, - "text": "category: \"分类\"," - }, - { - "line": 685, - "text": "statusReadyDesc: \"已索引可查询\"," - }, - { - "line": 686, - "text": "statusIndexingDesc: \"正在建立词向量索引\"," - }, - { - "line": 687, - "text": "selectCategory: \"选择分类\"," - }, - { - "line": 688, - "text": "noneUncategorized: \"无未分类文件\"," - }, - { - "line": 689, - "text": "previous: \"上一页\"," - }, - { - "line": 690, - "text": "next: \"下一页\"," - }, - { - "line": 691, - "text": "createCategory: \"创建分类\"," - }, - { - "line": 692, - "text": "categoryDesc: \"描述您的知识分类\"," - }, - { - "line": 693, - "text": "categoryName: \"分类名称\"," - }, - { - "line": 694, - "text": "createCategoryBtn: \"立即创建\"," - }, - { - "line": 695, - "text": "newGroup: \"新建分组\"," - }, - { - "line": 696, - "text": "noKnowledgeGroups: \"暂无知识库分组\"," - }, - { - "line": 697, - "text": "createGroupDesc: \"开始创建您的第一个知识库分组并上传相关文档。\"," - }, - { - "line": 698, - "text": "noDescriptionProvided: \"未提供描述\"," - }, - { - "line": 699, - "text": "browseManageFiles: \"浏览并管理该分组下的文件和笔记。\"," - }, - { - "line": 700, - "text": "filterGroupFiles: \"根据名称搜索分组内文件...\"," - }, - { - "line": 704, - "text": "agentTitle: \"智能体中心\"," - }, - { - "line": 705, - "text": "agentDesc: \"管理和运行您的 AI 助手,协助完成复杂任务。\"," - }, - { - "line": 706, - "text": "createAgent: \"创建智能体\"," - }, - { - "line": 707, - "text": "searchAgent: \"搜索智能体...\"," - }, - { - "line": 708, - "text": "statusRunning: \"运行中\"," - }, - { - "line": 709, - "text": "statusStopped: \"已停止\"," - }, - { - "line": 710, - "text": "updatedAtPrefix: \"最后更新于 \"," - }, - { - "line": 711, - "text": "btnChat: \"开始对话\"," - }, - { - "line": 714, - "text": "agent1Name: \"数据分析专家\"," - }, - { - "line": 715, - "text": "agent1Desc: \"精通 SQL 和数据可视化,能够从复杂数据中提取洞察。\"," - }, - { - "line": 716, - "text": "agent2Name: \"代码审查助手\"," - }, - { - "line": 717, - "text": "agent2Desc: \"自动检查代码质量,提供重构建议和性能优化方案。\"," - }, - { - "line": 718, - "text": "agent3Name: \"学术论文润色\"," - }, - { - "line": 719, - "text": "agent3Desc: \"专业的学术写作助手,帮助优化论文结构和语言表达。\"," - }, - { - "line": 720, - "text": "agent4Name: \"法律顾问\"," - }, - { - "line": 721, - "text": "agent4Desc: \"提供法律条文查询和基础法律建议,协助起草合同。\"," - }, - { - "line": 722, - "text": "agent5Name: \"市场研究员\"," - }, - { - "line": 723, - "text": "agent5Desc: \"分析行业趋势,生成竞争对手调研报告。\"," - }, - { - "line": 724, - "text": "agent6Name: \"系统运维专家\"," - }, - { - "line": 725, - "text": "agent6Desc: \"监控系统健康,自动处理常见告警和排障。\"," - }, - { - "line": 726, - "text": "agent7Name: \"财务审计师\"," - }, - { - "line": 727, - "text": "agent7Desc: \"自动化报表审计,识别财务风险和异常交易。\"," - }, - { - "line": 728, - "text": "agent1Time: \"2 小时前\"," - }, - { - "line": 729, - "text": "agent2Time: \"5 小时前\"," - }, - { - "line": 730, - "text": "agent3Time: \"昨天\"," - }, - { - "line": 731, - "text": "agent4Time: \"2 天前\"," - }, - { - "line": 732, - "text": "agent5Time: \"3 天前\"," - }, - { - "line": 733, - "text": "agent6Time: \"5 天前\"," - }, - { - "line": 734, - "text": "agent7Time: \"1 周前\"," - }, - { - "line": 737, - "text": "pluginTitle: \"插件中心\"," - }, - { - "line": 738, - "text": "pluginDesc: \"扩展知识库的功能,集成外部工具和服务。\"," - }, - { - "line": 739, - "text": "searchPlugin: \"搜索插件...\"," - }, - { - "line": 740, - "text": "installPlugin: \"安装插件\"," - }, - { - "line": 741, - "text": "installedPlugin: \"已安装\"," - }, - { - "line": 742, - "text": "updatePlugin: \"有更新\"," - }, - { - "line": 743, - "text": "pluginOfficial: \"官方\"," - }, - { - "line": 744, - "text": "pluginCommunity: \"社区\"," - }, - { - "line": 745, - "text": "pluginBy: \"由 \"," - }, - { - "line": 746, - "text": "pluginConfig: \"插件配置\"," - }, - { - "line": 749, - "text": "plugin1Name: \"Web 搜索\"," - }, - { - "line": 750, - "text": "plugin1Desc: \"赋予 AI 实时访问互联网的能力,获取最新信息。\"," - }, - { - "line": 751, - "text": "plugin2Name: \"PDF 文档解析\"," - }, - { - "line": 752, - "text": "plugin2Desc: \"深度解析复杂 PDF 布局,提取表格和数学公式。\"," - }, - { - "line": 753, - "text": "plugin3Name: \"GitHub 集成\"," - }, - { - "line": 754, - "text": "plugin3Desc: \"直接访问 GitHub 仓库,进行代码提交和 issue 管理。\"," - }, - { - "line": 755, - "text": "plugin4Name: \"Google 日历\"," - }, - { - "line": 756, - "text": "plugin4Desc: \"同步您的日程安排,自动创建会议提醒。\"," - }, - { - "line": 757, - "text": "plugin5Name: \"SQL 数据库连接\"," - }, - { - "line": 758, - "text": "plugin5Desc: \"安全地连接到您的数据库,执行自然语言查询。\"," - }, - { - "line": 759, - "text": "plugin6Name: \"Slack 通知\"," - }, - { - "line": 760, - "text": "plugin6Desc: \"将 AI 生成的报告直接发送到指定的 Slack 频道。\"," - }, - { - "line": 763, - "text": "addSubcategory: \"添加子分类\"," - }, - { - "line": 764, - "text": "parentCategory: \"父分类 (可选)\"," - }, - { - "line": 765, - "text": "noParentTopLevel: \"无父分类(顶级)\"," - }, - { - "line": 766, - "text": "useHierarchyImport: \"按文件夹层级创建分类\"," - }, - { - "line": 767, - "text": "useHierarchyImportDesc: \"启用后将为每个子文件夹创建对应的子分类,并将文件导入到匹配的分类中。\"," - }, - { - "line": 770, - "text": "importImmediate: \"立即导入\"," - }, - { - "line": 771, - "text": "importScheduled: \"定时导入\"," - }, - { - "line": 772, - "text": "lblServerPath: \"服务器文件夹路径\"," - }, - { - "line": 773, - "text": "placeholderServerPath: \"例如: /data/documents\"," - }, - { - "line": 774, - "text": "scheduledImportTip: \"服务器端定时导入:服务器将在指定时间读取该路径下的文件并自动导入。请确保服务器有访问该路径的权限。\"," - }, - { - "line": 775, - "text": "lblScheduledTime: \"执行时间\"," - }, - { - "line": 776, - "text": "scheduledTimeHint: \"到达指定时间后,服务器将自动执行导入任务。\"," - }, - { - "line": 777, - "text": "scheduleImport: \"创建定时任务\"," - }, - { - "line": 778, - "text": "scheduleTaskCreated: \"定时导入任务已创建\"," - }, - { - "line": 779, - "text": "fillServerPath: \"请输入服务器文件夹路径\"," - }, - { - "line": 780, - "text": "invalidDateTime: \"请输入有效的日期时间\"," - }, - { - "line": 783, - "text": "importTasksTitle: \"定时计划\"," - }, - { - "line": 784, - "text": "noTasksFound: \"暂无任务\"," - }, - { - "line": 785, - "text": "sourcePath: \"源路径\"," - }, - { - "line": 786, - "text": "targetGroup: \"目标分组\"," - }, - { - "line": 787, - "text": "scheduledAt: \"计划执行时间\"," - }, - { - "line": 788, - "text": "confirmDeleteTask: \"Confirm要删除此导入任务记录吗?\"," - }, - { - "line": 789, - "text": "deleteTaskFailed: \"删除任务记录失败\"," - }, - { - "line": 1591, - "text": "aiCommandsError: \"エラーが発生しました\"," - }, - { - "line": 1592, - "text": "appTitle: \"Gemini ナレッジベース\"," - }, - { - "line": 1593, - "text": "loginTitle: \"ログイン\"," - }, - { - "line": 1594, - "text": "loginDesc: \"システムに入るためのキーを入力してください\"," - }, - { - "line": 1595, - "text": "loginButton: \"ログイン\"," - }, - { - "line": 1596, - "text": "loginError: \"キーは必須です\"," - }, - { - "line": 1597, - "text": "unknown: \"不明\"," - }, - { - "line": 1598, - "text": "unknownError: \"未知のエラー\"," - }, - { - "line": 1599, - "text": "usernamePlaceholder: \"ユーザー名\"," - }, - { - "line": 1600, - "text": "passwordPlaceholder: \"パスワード\"," - }, - { - "line": 1601, - "text": "registerButton: \"登録\"," - }, - { - "line": 1602, - "text": "langZh: \"言語: 中国語\"," - }, - { - "line": 1603, - "text": "langEn: \"言語: 英語\"," - }, - { - "line": 1604, - "text": "langJa: \"言語: Japanese\"," - }, - { - "line": 1605, - "text": "confirm: \"確認\"," - }, - { - "line": 1606, - "text": "cancel: \"キャンセル\"," - }, - { - "line": 1607, - "text": "confirmTitle: \"操作の確認\"," - }, - { - "line": 1608, - "text": "confirmDeleteGroup: \"グループ \\\"$1\\\" を削除してもよろしいですか?\"," - }, - { - "line": 1610, - "text": "sidebarTitle: \"索引とチャットの設定\"," - }, - { - "line": 1611, - "text": "backToWorkspace: \"ワークスペースに戻る\"," - }, - { - "line": 1612, - "text": "goToAdmin: \"管理画面へ\"," - }, - { - "line": 1613, - "text": "sidebarDesc: \"ドキュメントとモデル管理\"," - }, - { - "line": 1614, - "text": "tabFiles: \"ドキュメント\"," - }, - { - "line": 1615, - "text": "files: \"ファイル\"," - }, - { - "line": 1616, - "text": "notes: \"メモ\"," - }, - { - "line": 1617, - "text": "tabSettings: \"設定\"," - }, - { - "line": 1618, - "text": "systemConfiguration: \"システム構成\"," - }, - { - "line": 1619, - "text": "noFiles: \"ファイルなし\"," - }, - { - "line": 1620, - "text": "noFilesDesc: \"PDF、Office文書、テキスト、コード、画像などをサポート\"," - }, - { - "line": 1621, - "text": "addFile: \"ファイルAdded\"," - }, - { - "line": 1622, - "text": "clearAll: \"全削除\"," - }, - { - "line": 1623, - "text": "uploading: \"処理中\"," - }, - { - "line": 1624, - "text": "statusIndexing: \"ベクトル化中...\"," - }, - { - "line": 1625, - "text": "statusReady: \"完了\"," - }, - { - "line": 1628, - "text": "ragSettings: \"RAG 設定\"," - }, - { - "line": 1629, - "text": "enableRerank: \"リランクを有効にする\"," - }, - { - "line": 1630, - "text": "enableRerankDesc: \"リランクモデルを使用してSearch resultsを再ランク付けし、精度を向上させます\"," - }, - { - "line": 1631, - "text": "selectRerankModel: \"リランクモデルの選択\"," - }, - { - "line": 1632, - "text": "selectModelPlaceholder: \"モデルを選択...\"," - }, - { - "line": 1634, - "text": "headerModelSelection: \"モデル選択\"," - }, - { - "line": 1635, - "text": "headerHyperparams: \"推論パラメータ\"," - }, - { - "line": 1636, - "text": "headerIndexing: \"インデックスと分割\"," - }, - { - "line": 1637, - "text": "headerRetrieval: \"検索とランク付け\"," - }, - { - "line": 1638, - "text": "btnManageModels: \"プロバイダー管理\"," - }, - { - "line": 1640, - "text": "lblLLM: \"推論モデル (LLM)\"," - }, - { - "line": 1641, - "text": "lblEmbedding: \"埋め込みモデル\"," - }, - { - "line": 1642, - "text": "lblRerankRef: \"リランクモデル\"," - }, - { - "line": 1643, - "text": "lblTemperature: \"温度 (Temperature)\"," - }, - { - "line": 1644, - "text": "lblMaxTokens: \"最大トークン数\"," - }, - { - "line": 1646, - "text": "lblChunkOverlap: \"オーバーラップ\"," - }, - { - "line": 1647, - "text": "lblTopK: \"検索数 (Top K)\"," - }, - { - "line": 1648, - "text": "lblRerank: \"リランク有効化\"," - }, - { - "line": 1650, - "text": "idxModalTitle: \"インデックス設定\"," - }, - { - "line": 1651, - "text": "idxDesc: \"取り込みの前に分割ルールと埋め込みモデルを設定してください。\"," - }, - { - "line": 1652, - "text": "idxFiles: \"対象ファイル\"," - }, - { - "line": 1653, - "text": "idxMethod: \"分割設定\"," - }, - { - "line": 1654, - "text": "idxEmbeddingModel: \"埋め込みモデル\"," - }, - { - "line": 1655, - "text": "idxStart: \"インデックス開始\"," - }, - { - "line": 1656, - "text": "idxCancel: \"キャンセル\"," - }, - { - "line": 1657, - "text": "idxAuto: \"自動\"," - }, - { - "line": 1658, - "text": "idxCustom: \"カスタム\"," - }, - { - "line": 1660, - "text": "mmTitle: \"モデルプロバイダー管理\"," - }, - { - "line": 1661, - "text": "mmAddBtn: \"モデルAdded\"," - }, - { - "line": 1662, - "text": "mmEdit: \"編集\"," - }, - { - "line": 1663, - "text": "mmDelete: \"削除\"," - }, - { - "line": 1664, - "text": "mmEmpty: \"設定されたモデルはありません\"," - }, - { - "line": 1665, - "text": "mmFormName: \"表示名\"," - }, - { - "line": 1666, - "text": "mmFormProvider: \"プロバイダー\"," - }, - { - "line": 1667, - "text": "mmFormModelId: \"モデルID (例: gpt-4o)\"," - }, - { - "line": 1669, - "text": "mmFormType: \"機能タイプ\"," - }, - { - "line": 1670, - "text": "mmFormVision: \"画像認識対応\"," - }, - { - "line": 1671, - "text": "mmFormDimensions: \"ベクトル次元\"," - }, - { - "line": 1672, - "text": "mmFormDimensionsHelp: \"埋め込みベクトルの次元数、一般的な値:1536、3072\"," - }, - { - "line": 1673, - "text": "mmSave: \"保存\"," - }, - { - "line": 1674, - "text": "mmCancel: \"キャンセル\"," - }, - { - "line": 1675, - "text": "mmErrorNotAuthenticated: \"認証されていません、操作できません\"," - }, - { - "line": 1676, - "text": "mmErrorTitle: \"操作失敗\"," - }, - { - "line": 1677, - "text": "modelEnabled: \"モデル有効\"," - }, - { - "line": 1678, - "text": "modelDisabled: \"モデル無効\"," - }, - { - "line": 1679, - "text": "confirmChangeEmbeddingModel: \"警告:埋め込みモデルを変更すると、既存のインデックスが検索できなくなる可能性があります。\\n変更してよろしいですか?\"," - }, - { - "line": 1680, - "text": "embeddingModelWarning: \"この設定を変更すると、ナレッジベースのクリアと再インポートが必要になる場合があります。\"," - }, - { - "line": 1681, - "text": "sourcePreview: \"引用元プレビュー\"," - }, - { - "line": 1682, - "text": "matchScore: \"一致度\"," - }, - { - "line": 1683, - "text": "copyContent: \"内容をコピー\"," - }, - { - "line": 1684, - "text": "copySuccess: \"コピーしました\"," - }, - { - "line": 1686, - "text": "// ConfigPanel 缺失の翻訳" - }, - { - "line": 1687, - "text": "selectLLMModel: \"LLMモデルを選択してください\"," - }, - { - "line": 1688, - "text": "selectEmbeddingModel: \"Embeddingモデルを選択してください\"," - }, - { - "line": 1689, - "text": "defaultForUploads: \"新しいアップロードとクエリのデフォルト\"," - }, - { - "line": 1690, - "text": "noRerankModel: \"リランクモデルなし\"," - }, - { - "line": 1691, - "text": "vectorSimilarityThreshold: \"ベクトル検索しきい値\"," - }, - { - "line": 1692, - "text": "rerankSimilarityThreshold: \"リランクしきい値\"," - }, - { - "line": 1693, - "text": "filterLowResults: \"この値を下回る結果はフィルタリングされます\"," - }, - { - "line": 1694, - "text": "noteCreatedSuccess: \"Create noteしました\"," - }, - { - "line": 1695, - "text": "noteCreatedFailed: \"ノートの作成に失敗しました\"," - }, - { - "line": 1696, - "text": "fullTextSearch: \"全文検索\"," - }, - { - "line": 1697, - "text": "hybridVectorWeight: \"ハイブリッド検索ベクトル重み\"," - }, - { - "line": 1698, - "text": "hybridVectorWeightDesc: \"重み: 1.0 = ベクトルのみ, 0.0 = キーワードのみ\"," - }, - { - "line": 1699, - "text": "lblQueryExpansion: \"クエリ拡張 (Multi-Query)\"," - }, - { - "line": 1700, - "text": "lblHyDE: \"HyDE (仮想ドキュメント埋め込み)\"," - }, - { - "line": 1701, - "text": "lblQueryExpansionDesc: \"検索カバレッジ向上のために複数のクエリを生成\"," - }, - { - "line": 1702, - "text": "lblHyDEDesc: \"セマンティック検索改善のために仮想回答を生成\"," - }, - { - "line": 1704, - "text": "apiKeyValidationFailed: \"API Key検証に失敗しました\"," - }, - { - "line": 1705, - "text": "keepOriginalKey: \"空のままにすると元のAPI Keyを保持、新しい値を入力すると置換\"," - }, - { - "line": 1706, - "text": "leaveEmptyNoChange: \"空のままで変更なし\"," - }, - { - "line": 1708, - "text": "mmFormApiKeyPlaceholder: \"API Key を入力してください\"," - }, - { - "line": 1710, - "text": "// さらに缺失している翻訳" - }, - { - "line": 1711, - "text": "reconfigureFile: \"ファイルの再設定\"," - }, - { - "line": 1712, - "text": "modifySettings: \"ファイルの分割とベクトル化設定を変更\"," - }, - { - "line": 1713, - "text": "filesCount: \"ファイル\"," - }, - { - "line": 1714, - "text": "allFilesIndexed: \"以下の設定ですべてのファイルがインデックス化されます。\"," - }, - { - "line": 1715, - "text": "noEmbeddingModels: \"埋め込みモデルが設定されていません\"," - }, - { - "line": 1716, - "text": "reconfigure: \"再設定\"," - }, - { - "line": 1717, - "text": "refresh: \"更新\"," - }, - { - "line": 1718, - "text": "settings: \"設定\"," - }, - { - "line": 1719, - "text": "needLogin: \"チャット機能を使用するにはログインが必要です\"," - }, - { - "line": 1720, - "text": "citationSources: \"引用元\"," - }, - { - "line": 1721, - "text": "chunkNumber: \"フラグメント\"," - }, - { - "line": 1722, - "text": "getUserListFailed: \"ユーザー一覧の取得に失敗しました\"," - }, - { - "line": 1723, - "text": "usernamePasswordRequired: \"ユーザー名とパスワードは必須です\"," - }, - { - "line": 1724, - "text": "passwordMinLength: \"パスワードは6文字以上で入力してください\"," - }, - { - "line": 1725, - "text": "userCreatedSuccess: \"ユーザーが作成されました\"," - }, - { - "line": 1726, - "text": "createUserFailed: \"ユーザー作成に失敗しました\"," - }, - { - "line": 1727, - "text": "userPromotedToAdmin: \"ユーザーを管理者に昇格しました\"," - }, - { - "line": 1728, - "text": "userDemotedFromAdmin: \"ユーザーを一般ユーザーに降格しました\"," - }, - { - "line": 1729, - "text": "updateUserFailed: \"ユーザー情報の更新に失敗しました\"," - }, - { - "line": 1730, - "text": "confirmDeleteUser: \"このユーザーを削除してもよろしいですか?\"," - }, - { - "line": 1731, - "text": "deleteUser: \"ユーザー削除\"," - }, - { - "line": 1732, - "text": "deleteUserFailed: \"ユーザーの削除に失敗しました\"," - }, - { - "line": 1733, - "text": "userDeletedSuccessfully: \"ユーザーを削除しました\"," - }, - { - "line": 1734, - "text": "makeUserAdmin: \"管理者にする\"," - }, - { - "line": 1735, - "text": "makeUserRegular: \"一般ユーザーにする\"," - }, - { - "line": 1736, - "text": "loading: \"読み込み中...\"," - }, - { - "line": 1737, - "text": "noUsers: \"ユーザーなし\"," - }, - { - "line": 1740, - "text": "aiAssistant: \"AI アシスタント\"," - }, - { - "line": 1741, - "text": "polishContent: \"内容を洗練\"," - }, - { - "line": 1742, - "text": "expandContent: \"展開\"," - }, - { - "line": 1743, - "text": "summarizeContent: \"要約\"," - }, - { - "line": 1744, - "text": "translateToEnglish: \"英語に翻訳\"," - }, - { - "line": 1745, - "text": "fixGrammar: \"文法修正\"," - }, - { - "line": 1746, - "text": "aiCommandInstructPolish: \"このテキストをよりプロフェッショナルで自然な表現に推敲してください。\"," - }, - { - "line": 1747, - "text": "aiCommandInstructExpand: \"このテキストに詳細をAddedして内容を充実させ、詳しく書き広げてください。\"," - }, - { - "line": 1748, - "text": "aiCommandInstructSummarize: \"このテキストの要点を抽出し、簡潔な要約を作成してください。\"," - }, - { - "line": 1749, - "text": "aiCommandInstructTranslateToEn: \"このテキストを英語に翻訳してください。\"," - }, - { - "line": 1750, - "text": "aiCommandInstructFixGrammar: \"このテキストの文法やスペルの誤りをチェックし、修正してください。\"," - }, - { - "line": 1751, - "text": "aiCommandsPreset: \"よく使うコマンド\"," - }, - { - "line": 1752, - "text": "aiCommandsCustom: \"カスタムリクエスト\"," - }, - { - "line": 1753, - "text": "aiCommandsCustomPlaceholder: \"例:この文章をより正式なものに書き直してください...\"," - }, - { - "line": 1754, - "text": "aiCommandsReferenceContext: \"参照コンテキスト (最初の200文字):\"," - }, - { - "line": 1755, - "text": "aiCommandsStartGeneration: \"生成開始\"," - }, - { - "line": 1756, - "text": "aiCommandsResult: \"AIの提案\"," - }, - { - "line": 1757, - "text": "aiCommandsGenerating: \"生成中...\"," - }, - { - "line": 1758, - "text": "aiCommandsApplyResult: \"選択範囲を置換\"," - }, - { - "line": 1759, - "text": "aiCommandsGoBack: \"戻る\"," - }, - { - "line": 1760, - "text": "aiCommandsReset: \"リセット\"," - }, - { - "line": 1761, - "text": "aiCommandsModalPreset: \"プリセットコマンドを選択\"," - }, - { - "line": 1762, - "text": "aiCommandsModalCustom: \"またはカスタムコマンドを入力\"," - }, - { - "line": 1763, - "text": "aiCommandsModalCustomPlaceholder: \"AIに何をしたいか伝えてください...\"," - }, - { - "line": 1764, - "text": "aiCommandsModalBasedOnSelection: \"選択したテキストに基づいて:\"," - }, - { - "line": 1765, - "text": "aiCommandsModalResult: \"生成結果\"," - }, - { - "line": 1766, - "text": "aiCommandsModalApply: \"結果を適用\"," - }, - { - "line": 1768, - "text": "// ChangePasswordModal と SearchResultsPanel の缺失翻訳" - }, - { - "line": 1769, - "text": "fillAllFields: \"すべてのフィールドを入力してください\"," - }, - { - "line": 1770, - "text": "passwordMismatch: \"新しいパスワードと確認パスワードが一致しません\"," - }, - { - "line": 1771, - "text": "newPasswordMinLength: \"新しいパスワードは6文字以上で入力してください\"," - }, - { - "line": 1772, - "text": "changePasswordFailed: \"パスワードの変更に失敗しました\"," - }, - { - "line": 1773, - "text": "changePasswordTitle: \"パスワード変更\"," - }, - { - "line": 1774, - "text": "changing: \"変更中...\"," - }, - { - "line": 1775, - "text": "searchResults: \"関連コンテンツが見つかりました\"," - }, - { - "line": 1777, - "text": "// VisionModelSelector の缺失翻訳" - }, - { - "line": 1778, - "text": "visionModelSettings: \"ビジョンモデル設定\"," - }, - { - "line": 1779, - "text": "defaultVisionModel: \"デフォルトビジョンモデル\"," - }, - { - "line": 1780, - "text": "loadVisionModelFailed: \"ビジョンモデルの読み込みに失敗しました\"," - }, - { - "line": 1781, - "text": "loadFailed: \"読み込みに失敗しました、ネットワーク接続を確認してください\"," - }, - { - "line": 1782, - "text": "saveVisionModelFailed: \"ビジョンモデルの保存に失敗しました\"," - }, - { - "line": 1783, - "text": "noVisionModels: \"利用可能なビジョンモデルがありません\"," - }, - { - "line": 1784, - "text": "selectVisionModel: \"ビジョンモデルを選択してください\"," - }, - { - "line": 1785, - "text": "visionModelHelp: \"画像ファイルを処理するためのビジョンモデル。利用可能なモデルがない場合は、モデル管理でAddedし、「ビジョン対応」オプションをチェックしてください。\"," - }, - { - "line": 1786, - "text": "mmErrorNameRequired: \"Model nameは必須要素です\"," - }, - { - "line": 1787, - "text": "mmErrorModelIdRequired: \"モデルIDは必須です。\"," - }, - { - "line": 1788, - "text": "mmErrorBaseUrlRequired: \"選択されたプロバイダーにはBase URLが必要です。\"," - }, - { - "line": 1791, - "text": "typeLLM: \"推論 (LLM)\"," - }, - { - "line": 1792, - "text": "typeEmbedding: \"ベクトル化 (Embedding)\"," - }, - { - "line": 1793, - "text": "typeRerank: \"リランク (Rerank)\"," - }, - { - "line": 1794, - "text": "typeVision: \"画像認識 (Vision)\"," - }, - { - "line": 1796, - "text": "welcome: \"こんにちは!設定でモデルを選択し、ドキュメントをアップロードして質問を開始してください。\"," - }, - { - "line": 1797, - "text": "placeholderWithFiles: \"ナレッジベースについて質問...\"," - }, - { - "line": 1798, - "text": "placeholderEmpty: \"開始するにはファイルをアップロード...\"," - }, - { - "line": 1799, - "text": "analyzing: \"検索して生成中...\"," - }, - { - "line": 1800, - "text": "errorGeneric: \"エラーが発生しました。\"," - }, - { - "line": 1801, - "text": "errorLabel: \"エラー\"," - }, - { - "line": 1802, - "text": "errorNoModel: \"モデルが選択されていないか、設定が無効です。\"," - }, - { - "line": 1803, - "text": "aiDisclaimer: \"AIは間違いを犯す可能性があります。\"," - }, - { - "line": 1804, - "text": "confirmClear: \"すべてのファイルを削除しますか?\"," - }, - { - "line": 1805, - "text": "removeFile: \"ファイルを削除\"," - }, - { - "line": 1806, - "text": "apiError: \"設定が不足しているか、APIキーが有効ではありません。\"," - }, - { - "line": 1808, - "text": "processedButNoText: \"応答を生成できませんでした。\"," - }, - { - "line": 1809, - "text": "unitByte: \"バイト\"," - }, - { - "line": 1810, - "text": "readingFailed: \"読み込み失敗\"," - }, - { - "line": 1812, - "text": "copy: \"コピー\"," - }, - { - "line": 1813, - "text": "copied: \"コピーしました\"," - }, - { - "line": 1816, - "text": "logout: \"ログアウト\"," - }, - { - "line": 1817, - "text": "changePassword: \"パスワード変更\"," - }, - { - "line": 1818, - "text": "userManagement: \"ユーザー管理\"," - }, - { - "line": 1819, - "text": "userList: \"ユーザー一覧\"," - }, - { - "line": 1820, - "text": "addUser: \"ユーザーAdded\"," - }, - { - "line": 1821, - "text": "username: \"ユーザー名\"," - }, - { - "line": 1822, - "text": "password: \"パスワード\"," - }, - { - "line": 1823, - "text": "confirmPassword: \"パスワード確認\"," - }, - { - "line": 1824, - "text": "currentPassword: \"現在のパスワード\"," - }, - { - "line": 1825, - "text": "newPassword: \"新しいパスワード\"," - }, - { - "line": 1826, - "text": "createUser: \"ユーザー作成\"," - }, - { - "line": 1827, - "text": "admin: \"管理者\"," - }, - { - "line": 1828, - "text": "user: \"ユーザー\"," - }, - { - "line": 1829, - "text": "adminUser: \"管理者として設定\"," - }, - { - "line": 1830, - "text": "confirmChange: \"変更を確定\"," - }, - { - "line": 1831, - "text": "changeUserPassword: \"ユーザーのパスワードを変更\"," - }, - { - "line": 1832, - "text": "enterNewPassword: \"新しいパスワードを入力してください\"," - }, - { - "line": 1833, - "text": "createdAt: \"作成日時\"," - }, - { - "line": 1834, - "text": "newChat: \"新しい会話\"," - }, - { - "line": 1837, - "text": "kbManagement: \"ナレッジベース管理\"," - }, - { - "line": 1838, - "text": "kbManagementDesc: \"ドキュメントとナレッジグループの管理\"," - }, - { - "line": 1839, - "text": "searchPlaceholder: \"ファイル名を検索...\"," - }, - { - "line": 1840, - "text": "allGroups: \"すべてのグループ\"," - }, - { - "line": 1841, - "text": "allStatus: \"すべてのステータス\"," - }, - { - "line": 1842, - "text": "statusReadyFragment: \"完了\"," - }, - { - "line": 1843, - "text": "statusFailedFragment: \"失敗\"," - }, - { - "line": 1844, - "text": "statusIndexingFragment: \"インデックス中\"," - }, - { - "line": 1845, - "text": "uploadFile: \"ファイルをアップロード\"," - }, - { - "line": 1846, - "text": "fileName: \"ファイル名\"," - }, - { - "line": 1847, - "text": "size: \"サイズ\"," - }, - { - "line": 1848, - "text": "status: \"ステータス\"," - }, - { - "line": 1849, - "text": "groups: \"グループ\"," - }, - { - "line": 1850, - "text": "actions: \"アクション\"," - }, - { - "line": 1851, - "text": "groupsActions: \"グループ / アクション\"," - }, - { - "line": 1852, - "text": "noFilesFound: \"ファイルが見つかりません\"," - }, - { - "line": 1853, - "text": "showingRange: \"$3 件中 $1 - $2 を表示\"," - }, - { - "line": 1854, - "text": "confirmDeleteFile: \"このファイルを削除してもよろしいですか?\"," - }, - { - "line": 1855, - "text": "fileDeleted: \"ファイルを削除しました\"," - }, - { - "line": 1856, - "text": "deleteFailed: \"削除に失敗しました\"," - }, - { - "line": 1857, - "text": "fileAddedToGroup: \"ファイルがグループにAddedされました\"," - }, - { - "line": 1858, - "text": "failedToAddToGroup: \"グループへのAddedに失敗しました\"," - }, - { - "line": 1859, - "text": "fileRemovedFromGroup: \"ファイルがグループから削除されました\"," - }, - { - "line": 1860, - "text": "failedToRemoveFromGroup: \"グループからの削除に失敗しました\"," - }, - { - "line": 1861, - "text": "confirmClearKB: \"警告:これによりすべてのファイルとインデックスが完全に削除されます。\\n\\n本当にナレッジベースをクリアしますか?\"," - }, - { - "line": 1862, - "text": "kbCleared: \"ナレッジベースをクリアしました\"," - }, - { - "line": 1863, - "text": "clearFailed: \"クリアに失敗しました\"," - }, - { - "line": 1864, - "text": "loginRequired: \"先にログインしてください\"," - }, - { - "line": 1865, - "text": "uploadErrors: \"以下のファイルはアップロードできませんでした\"," - }, - { - "line": 1866, - "text": "uploadWarning: \"$1 つのファイルがアップロード準備完了、$2 つがフィルタリングされました\"," - }, - { - "line": 1867, - "text": "uploadFailed: \"アップロードに失敗しました\"," - }, - { - "line": 1868, - "text": "preview: \"プレビュー\"," - }, - { - "line": 1869, - "text": "addGroup: \"グループAdded\"," - }, - { - "line": 1870, - "text": "delete: \"削除\"," - }, - { - "line": 1871, - "text": "retry: \"再試行\"," - }, - { - "line": 1872, - "text": "retrying: \"再試行中...\"," - }, - { - "line": 1873, - "text": "retrySuccess: \"再試行成功\"," - }, - { - "line": 1874, - "text": "retryFailed: \"再試行失敗\"," - }, - { - "line": 1875, - "text": "chunkInfo: \"チャンク情報\"," - }, - { - "line": 1876, - "text": "totalChunks: \"総チャンク数\"," - }, - { - "line": 1877, - "text": "chunkIndex: \"チャンク\"," - }, - { - "line": 1878, - "text": "contentLength: \"文字\"," - }, - { - "line": 1879, - "text": "position: \"位置\"," - }, - { - "line": 1882, - "text": "reconfigureTitle: \"ファイルの再設定\"," - }, - { - "line": 1883, - "text": "reconfigureDesc: \"ファイル処理設定を変更\"," - }, - { - "line": 1884, - "text": "indexingConfigTitle: \"ドキュメントインデックス設定\"," - }, - { - "line": 1885, - "text": "indexingConfigDesc: \"ドキュメント処理オプションとモードを設定\"," - }, - { - "line": 1886, - "text": "pendingFiles: \"待機中のファイル\"," - }, - { - "line": 1887, - "text": "processingMode: \"処理モード\"," - }, - { - "line": 1889, - "text": "recommendationReason: \"理由\"," - }, - { - "line": 1891, - "text": "fastModeDesc: \"単純なテキスト抽出、Fast、No additional cost、純粋なテキストに適しています\"," - }, - { - "line": 1893, - "text": "preciseModeDesc: \"精密なレイアウト分析、表/画像を保持、APIコストがかかります\"," - }, - { - "line": 1894, - "text": "fastModeFeatures: \"Fast Modeの特徴:\"," - }, - { - "line": 1895, - "text": "fastFeature1: \"単純なテキスト抽出\"," - }, - { - "line": 1896, - "text": "fastFeature2: \"Fastな処理速度\"," - }, - { - "line": 1898, - "text": "fastFeature4: \"テキストのみ処理\"," - }, - { - "line": 1899, - "text": "fastFeature5: \"プレーンテキストに適しています\"," - }, - { - "line": 1900, - "text": "preciseModeFeatures: \"Precise Modeの特徴:\"," - }, - { - "line": 1901, - "text": "preciseFeature1: \"精密な構造認識\"," - }, - { - "line": 1902, - "text": "preciseFeature2: \"画像/表/チャートを認識\"," - }, - { - "line": 1903, - "text": "preciseFeature3: \"混合コンテンツを保持\"," - }, - { - "line": 1905, - "text": "preciseFeature5: \"APIコストが必要\"," - }, - { - "line": 1906, - "text": "preciseFeature6: \"処理時間が長くなります\"," - }, - { - "line": 1907, - "text": "embeddingModel: \"埋め込みモデル\"," - }, - { - "line": 1908, - "text": "pleaseSelect: \"選択してください...\"," - }, - { - "line": 1909, - "text": "pleaseSelectKnowledgeGroupFirst: \"保存する前に知識グループを選択してください\"," - }, - { - "line": 1910, - "text": "selectUnassignGroupWarning: \"ナレッジグループの割り当てを解除する場合は、この操作を確認してください\"," - }, - { - "line": 1912, - "text": "chunkSize: \"Chunk size (トークン)\"," - }, - { - "line": 1913, - "text": "min: \"最小\"," - }, - { - "line": 1914, - "text": "max: \"最大\"," - }, - { - "line": 1915, - "text": "chunkOverlap: \"オーバーラップ (トークン)\"," - }, - { - "line": 1916, - "text": "modelLimitsInfo: \"モデル制限情報\"," - }, - { - "line": 1917, - "text": "model: \"モデル\"," - }, - { - "line": 1918, - "text": "maxChunkSize: \"最大チャンク\"," - }, - { - "line": 1919, - "text": "maxOverlapSize: \"最大オーバーラップ\"," - }, - { - "line": 1920, - "text": "maxBatchSize: \"最大バッチ\"," - }, - { - "line": 1921, - "text": "envLimitWeaker: \"環境制限の方が厳しいです\"," - }, - { - "line": 1922, - "text": "optimizationTips: \"最適化のヒント\"," - }, - { - "line": 1923, - "text": "tipChunkTooLarge: \"Chunk sizeが大きいと検索精度に影響する可能性があります\"," - }, - { - "line": 1924, - "text": "tipOverlapSmall: \"オーバーラップは少なくとも $1 トークンを推奨します\"," - }, - { - "line": 1925, - "text": "tipMaxValues: \"最大値を使用すると処理が遅くなる可能性があります\"," - }, - { - "line": 1926, - "text": "tipPreciseCost: \"Precise ModeはAPIコストが発生します。予算を確認してください\"," - }, - { - "line": 1927, - "text": "selectEmbeddingFirst: \"先に埋め込みモデルを選択してください\"," - }, - { - "line": 1928, - "text": "confirmPreciseCost: \"Precise ModeはAPIコストが発生します。続けますか?\"," - }, - { - "line": 1929, - "text": "startProcessing: \"処理開始\"," - }, - { - "line": 1932, - "text": "notebooks: \"ナレッジグループ\"," - }, - { - "line": 1933, - "text": "notebooksDesc: \"研究プロジェクトやナレッジコレクションを管理\"," - }, - { - "line": 1934, - "text": "createNotebook: \"新しいナレッジグループ\"," - }, - { - "line": 1935, - "text": "chatWithNotebook: \"このグループとチャット\"," - }, - { - "line": 1936, - "text": "editNotebook: \"グループを編集\"," - }, - { - "line": 1937, - "text": "deleteNotebook: \"Delete group (ファイルを含む)\"," - }, - { - "line": 1938, - "text": "noDescription: \"説明なし\"," - }, - { - "line": 1939, - "text": "hasIntro: \"紹介あり\"," - }, - { - "line": 1940, - "text": "noIntro: \"紹介なし\"," - }, - { - "line": 1941, - "text": "noNotebooks: \"ナレッジグループはまだありません。右上の作成ボタンをクリックしてください\"," - }, - { - "line": 1942, - "text": "createFailed: \"作成に失敗しました\"," - }, - { - "line": 1943, - "text": "confirmDeleteNotebook: \"知識グループ \\\"$1\\\" を削除してもよろしいですか?\\n\\n注意:これにより、この知識グループ内のすべてのファイルとそのインデックスデータも完全に削除されます!\"," - }, - { - "line": 1946, - "text": "errorFileTooLarge: \"ファイルサイズが大きすぎます (20MB以下)\"," - }, - { - "line": 1947, - "text": "noFilesYet: \"ファイルがありません\"," - }, - { - "line": 1950, - "text": "createNotebookTitle: \"新しいナレッジグループ\"," - }, - { - "line": 1951, - "text": "editNotebookTitle: \"ナレッジグループを編集\"," - }, - { - "line": 1952, - "text": "createFailedRetry: \"作成に失敗しました。再試行してください\"," - }, - { - "line": 1953, - "text": "updateFailedRetry: \"更新に失敗しました。再試行してください\"," - }, - { - "line": 1954, - "text": "name: \"名前\"," - }, - { - "line": 1955, - "text": "nameHelp: \"明確な名前を付けると見つけやすくなります。\"," - }, - { - "line": 1956, - "text": "namePlaceholder: \"例: 量子物理学研究...\"," - }, - { - "line": 1957, - "text": "shortDescription: \"短い説明\"," - }, - { - "line": 1958, - "text": "descPlaceholder: \"このグループの目的を一文で説明\"," - }, - { - "line": 1959, - "text": "detailedIntro: \"詳細な紹介\"," - }, - { - "line": 1960, - "text": "introPlaceholder: \"ここの段落は、Q&Aのコンテキストに含まれる可能性があります。このグループの主要なトピック、背景知識、または目標をできるだけ詳しく説明してください。\"," - }, - { - "line": 1961, - "text": "introHelp: \"この紹介は、会話のAddedコンテキストとして使用されます。\"," - }, - { - "line": 1962, - "text": "creating: \"作成中...\"," - }, - { - "line": 1963, - "text": "createNow: \"今すぐ作成\"," - }, - { - "line": 1964, - "text": "saving: \"保存中...\"," - }, - { - "line": 1965, - "text": "save: \"保存\"," - }, - { - "line": 1968, - "text": "chatTitle: \"ナレッジベースチャット\"," - }, - { - "line": 1969, - "text": "chatDesc: \"ナレッジベースとのスマートな会話\"," - }, - { - "line": 1970, - "text": "viewHistory: \"チャット履歴を表示\"," - }, - { - "line": 1971, - "text": "saveSettingsFailed: \"設定の保存に失敗しました\"," - }, - { - "line": 1972, - "text": "loginToUpload: \"アップロードするにはログインしてください\"," - }, - { - "line": 1973, - "text": "fileSizeLimitExceeded: \"$1 ($2 - $3MB の制限)\"," - }, - { - "line": 1974, - "text": "unsupportedFileType: \"$1 - サポートされていないファイルタイプ ($2)\"," - }, - { - "line": 1975, - "text": "readFailed: \"$1 - 読み込みに失敗しました\"," - }, - { - "line": 1976, - "text": "loadHistoryFailed: \"履歴の読み込みに失敗しました\"," - }, - { - "line": 1977, - "text": "loadingUserData: \"ユーザーデータを読み込み中...\"," - }, - { - "line": 1978, - "text": "errorMessage: \"エラー: $1\"," - }, - { - "line": 1979, - "text": "welcomeMessage: \"こんにちは!私はあなたのAIナレッジベースアシスタントです。チャットを開始するにはナレッジグループを選択してください。\"," - }, - { - "line": 1980, - "text": "selectKnowledgeGroup: \"ナレッジグループを選択\"," - }, - { - "line": 1981, - "text": "allKnowledgeGroups: \"すべてのナレッジグループ\"," - }, - { - "line": 1982, - "text": "unknownGroup: \"不明なグループ\"," - }, - { - "line": 1983, - "text": "selectedGroupsCount: \"$1 グループ選択済み\"," - }, - { - "line": 1986, - "text": "generalSettings: \"一般設定\"," - }, - { - "line": 1987, - "text": "modelManagement: \"モデル管理\"," - }, - { - "line": 1988, - "text": "languageSettings: \"言語設定\"," - }, - { - "line": 1989, - "text": "passwordChangeSuccess: \"パスワードを変更しました\"," - }, - { - "line": 1990, - "text": "passwordChangeFailed: \"パスワードの変更に失敗しました\"," - }, - { - "line": 1991, - "text": "create: \"作成\"," - }, - { - "line": 1995, - "text": "navChat: \"チャット\"," - }, - { - "line": 1996, - "text": "navCoach: \"コーチ\"," - }, - { - "line": 1997, - "text": "navKnowledge: \"ナレッジベース\"," - }, - { - "line": 1998, - "text": "navKnowledgeGroups: \"ナレッジグループ\"," - }, - { - "line": 1999, - "text": "navNotebook: \"ノートブック\"," - }, - { - "line": 2000, - "text": "navAgent: \"エージェント\"," - }, - { - "line": 2001, - "text": "navPlugin: \"プラグイン\"," - }, - { - "line": 2002, - "text": "navCrawler: \"リソース取得\"," - }, - { - "line": 2003, - "text": "expandMenu: \"メニューを展開\"," - }, - { - "line": 2004, - "text": "switchLanguage: \"言語を切り替える\"," - }, - { - "line": 2007, - "text": "selectKnowledgeGroups: \"ナレッジグループを選択\"," - }, - { - "line": 2008, - "text": "searchGroupsPlaceholder: \"グループを検索...\"," - }, - { - "line": 2009, - "text": "done: \"完了\"," - }, - { - "line": 2010, - "text": "all: \"すべて\"," - }, - { - "line": 2011, - "text": "noGroupsFound: \"関連するグループが見つかりません\"," - }, - { - "line": 2012, - "text": "noGroups: \"グループなし\"," - }, - { - "line": 2015, - "text": "autoRefresh: \"自動更新\"," - }, - { - "line": 2016, - "text": "refreshInterval: \"更新間隔\"," - }, - { - "line": 2019, - "text": "errorRenderFlowchart: \"フローチャートを生成できません\"," - }, - { - "line": 2020, - "text": "errorLoadData: \"データの読み込みに失敗しました\"," - }, - { - "line": 2021, - "text": "confirmUnsupportedFile: \"拡張子 .$1 はサポートされていない可能性があります。続行しますか?\"," - }, - { - "line": 2022, - "text": "errorReadFile: \"ファイルの読み込みに失敗しました: $1\"," - }, - { - "line": 2023, - "text": "successUploadFile: \"ファイルのアップロードと関連付けに成功しました\"," - }, - { - "line": 2024, - "text": "errorUploadFile: \"アップロードに失敗しました: $1\"," - }, - { - "line": 2025, - "text": "errorProcessFile: \"ファイルの処理に失敗しました\"," - }, - { - "line": 2026, - "text": "errorTitleContentRequired: \"タイトルと内容は必須です\"," - }, - { - "line": 2027, - "text": "successNoteUpdated: \"メモを更新しました\"," - }, - { - "line": 2028, - "text": "successNoteCreated: \"メモを作成しました\"," - }, - { - "line": 2029, - "text": "errorSaveFailed: \"保存に失敗しました: $1\"," - }, - { - "line": 2030, - "text": "confirmDeleteNote: \"このメモを削除してもよろしいですか?\"," - }, - { - "line": 2031, - "text": "successNoteDeleted: \"メモを削除しました\"," - }, - { - "line": 2032, - "text": "confirmRemoveFileFromGroup: \"ファイル「$1」をこのグループから削除しますか?(ナレッジベースには残ります)\"," - }, - { - "line": 2033, - "text": "editNote: \"メモを編集\"," - }, - { - "line": 2034, - "text": "newNote: \"新規メモ\"," - }, - { - "line": 2035, - "text": "togglePreviewOpen: \"プレビューを表示\"," - }, - { - "line": 2036, - "text": "togglePreviewClose: \"プレビューを閉じる\"," - }, - { - "line": 2037, - "text": "noteTitlePlaceholder: \"メモのタイトル\"," - }, - { - "line": 2038, - "text": "noteContentPlaceholder: \"書き始める (Markdown 対応)...\"," - }, - { - "line": 2039, - "text": "markdownPreviewArea: \"Markdown プレビューエリア\"," - }, - { - "line": 2040, - "text": "back: \"戻る\"," - }, - { - "line": 2041, - "text": "chatWithGroup: \"このグループとチャット\"," - }, - { - "line": 2042, - "text": "chatWithFile: \"このファイルとチャット\"," - }, - { - "line": 2043, - "text": "filesCountLabel: \"ファイル ($1)\"," - }, - { - "line": 2044, - "text": "notesCountLabel: \"メモ ($1)\"," - }, - { - "line": 2045, - "text": "indexIntoKB: \"インデックスに登録\"," - }, - { - "line": 2046, - "text": "noFilesOrNotes: \"$1がありません\"," - }, - { - "line": 2047, - "text": "importFolder: \"フォルダをインポート\"," - }, - { - "line": 2051, - "text": "screenshotPreview: \"スクリーンショットプレビュー\"," - }, - { - "line": 2052, - "text": "associateKnowledgeGroup: \"ナレッジグループに関連付ける\"," - }, - { - "line": 2053, - "text": "globalNoSpecificGroup: \"全体 (特定のグループなし)\"," - }, - { - "line": 2054, - "text": "title: \"タイトル\"," - }, - { - "line": 2055, - "text": "enterNoteTitle: \"ノートのタイトルを入力\"," - }, - { - "line": 2056, - "text": "contentOCR: \"内容 (OCR抽出されたテキスト)\"," - }, - { - "line": 2057, - "text": "extractingText: \"テキストを抽出中...\"," - }, - { - "line": 2058, - "text": "analyzingImage: \"画像を分析してテキストを抽出中...\"," - }, - { - "line": 2059, - "text": "noTextExtracted: \"テキストが抽出されませんでした\"," - }, - { - "line": 2060, - "text": "saveNote: \"ノートを保存\"," - }, - { - "line": 2063, - "text": "page: \"ページ\"," - }, - { - "line": 2064, - "text": "placeholderText: \"OCR抽出されたテキストがここに表示されます。編集できます...\"," - }, - { - "line": 2067, - "text": "createNewNotebook: \"新しいナレッジグループ\"," - }, - { - "line": 2068, - "text": "nameField: \"名前\"," - }, - { - "line": 2070, - "text": "exampleResearch: \"例: 量子物理学研究...\"," - }, - { - "line": 2071, - "text": "shortDescriptionField: \"簡単な説明\"," - }, - { - "line": 2072, - "text": "describePurpose: \"このグループの目的を一文で説明してください\"," - }, - { - "line": 2073, - "text": "detailedIntroField: \"詳細な紹介\"," - }, - { - "line": 2074, - "text": "provideBackgroundInfo: \"詳細な背景、目標、またはコンテキスト情報を提供してください...\"," - }, - { - "line": 2075, - "text": "creationFailed: \"作成に失敗しました。もう一度お試しください\"," - }, - { - "line": 2078, - "text": "preparingPDFConversion: \"PDF変換を準備中...\"," - }, - { - "line": 2079, - "text": "pleaseWait: \"しばらくお待ちください。これには数分かかる場合があります\"," - }, - { - "line": 2080, - "text": "convertingPDF: \"PDFを変換中...\"," - }, - { - "line": 2081, - "text": "pdfConversionFailed: \"PDF変換に失敗しました\"," - }, - { - "line": 2082, - "text": "pdfConversionError: \"このファイルをPDF形式に変換できません。ファイルが破損していないか、サポートされていない形式でないか確認してください\"," - }, - { - "line": 2083, - "text": "pdfLoadFailed: \"PDF読み込みに失敗しました\"," - }, - { - "line": 2084, - "text": "pdfLoadError: \"ブラウザでPDFを表示できません。ダウンロードするか、新しいウィンドウで開いてみてください\"," - }, - { - "line": 2085, - "text": "downloadingPDF: \"PDFをダウンロード中...\"," - }, - { - "line": 2086, - "text": "loadingPDF: \"PDFを読み込み中...\"," - }, - { - "line": 2087, - "text": "zoomOut: \"ズームアウト\"," - }, - { - "line": 2088, - "text": "zoomIn: \"ズームイン\"," - }, - { - "line": 2089, - "text": "resetZoom: \"ズームをリセット\"," - }, - { - "line": 2090, - "text": "selectPageNumber: \"Page numberを選択:\"," - }, - { - "line": 2091, - "text": "enterPageNumber: \"選択したいPage numberを入力してください\"," - }, - { - "line": 2092, - "text": "exitSelectionMode: \"選択モードを終了\"," - }, - { - "line": 2093, - "text": "clickToSelectAndNote: \"クリックして領域を選択し、メモを取る\"," - }, - { - "line": 2094, - "text": "regeneratePDF: \"PDFを再生成\"," - }, - { - "line": 2095, - "text": "downloadPDF: \"PDFをダウンロード\"," - }, - { - "line": 2096, - "text": "openInNewWindow: \"新しいウィンドウで開く\"," - }, - { - "line": 2097, - "text": "exitFullscreen: \"全画面表示を終了\"," - }, - { - "line": 2098, - "text": "fullscreenDisplay: \"全画面表示\"," - }, - { - "line": 2099, - "text": "pdfPreview: \"PDFプレビュー\"," - }, - { - "line": 2100, - "text": "converting: \"変換中...\"," - }, - { - "line": 2101, - "text": "generatePDFPreview: \"PDFプレビューを生成\"," - }, - { - "line": 2102, - "text": "previewNotSupported: \"この形式はプレビューをサポートしていません\"," - }, - { - "line": 2105, - "text": "confirmRegeneratePDF: \"PDFを再生成してもよろしいですか?これにより現在のプレビューファイルが上書きされます。\"," - }, - { - "line": 2108, - "text": "pdfPreviewReady: \"PDFプレビュー\"," - }, - { - "line": 2109, - "text": "convertingInProgress: \"変換中...\"," - }, - { - "line": 2110, - "text": "conversionFailed: \"変換失敗\"," - }, - { - "line": 2111, - "text": "generatePDFPreviewButton: \"PDFプレビューを生成\"," - }, - { - "line": 2114, - "text": "checkPDFStatusFailed: \"PDFステータスの確認に失敗しました\"," - }, - { - "line": 2115, - "text": "requestRegenerationFailed: \"再生成要求に失敗しました\"," - }, - { - "line": 2116, - "text": "downloadPDFFailed: \"PDFのダウンロードに失敗しました\"," - }, - { - "line": 2117, - "text": "openPDFInNewTabFailed: \"新しいウィンドウでのPDFオープンに失敗しました\"," - }, - { - "line": 2120, - "text": "invalidFile: \"無効なファイル\"," - }, - { - "line": 2121, - "text": "incompleteFileInfo: \"ファイル情報が不完全です。Fast Modeを使用します\"," - }, - { - "line": 2122, - "text": "unsupportedFileFormat: \"サポートされていない形式: .$1\"," - }, - { - "line": 2123, - "text": "willUseFastMode: \"Fast Mode(テキスト抽出のみ)を使用します\"," - }, - { - "line": 2124, - "text": "formatNoPrecise: \"形式 .$1 はPrecise Modeをサポートしていません\"," - }, - { - "line": 2125, - "text": "smallFileFastOk: \"ファイルサイズが小さいため、Fast Modeで十分です\"," - }, - { - "line": 2126, - "text": "mixedContentPreciseRecommended: \"図表などが含まれるため、Precise Modeを推奨します\"," - }, - { - "line": 2127, - "text": "willIncurApiCost: \"APIコストが発生します\"," - }, - { - "line": 2128, - "text": "largeFilePreciseRecommended: \"大きなファイルです。構造保持のためPrecise Modeを推奨します\"," - }, - { - "line": 2129, - "text": "longProcessingTime: \"処理に時間がかかる可能性があります\"," - }, - { - "line": 2130, - "text": "highApiCost: \"高いAPIコストが発生します\"," - }, - { - "line": 2131, - "text": "considerFileSplitting: \"ファイルの分割を検討してください\"," - }, - { - "line": 2134, - "text": "dragDropUploadTitle: \"File to uploadをドラッグ&ドロップ\"," - }, - { - "line": 2135, - "text": "dragDropUploadDesc: \"または下のボタンをクリックしてファイルを選択\"," - }, - { - "line": 2136, - "text": "supportedFormats: \"対応フォーマット\"," - }, - { - "line": 2137, - "text": "browseFiles: \"ファイルを参照\"," - }, - { - "line": 2140, - "text": "recommendationMsg: \"$1モードを推奨します: $2\"," - }, - { - "line": 2141, - "text": "autoAdjustChunk: \"Chunk sizeを上限の $1 に調整しました\"," - }, - { - "line": 2142, - "text": "autoAdjustOverlap: \"重なりサイズを上限の $1 に調整しました\"," - }, - { - "line": 2143, - "text": "autoAdjustOverlapMin: \"重なりサイズを最小値の $1 に調整しました\"," - }, - { - "line": 2144, - "text": "loadLimitsFailed: \"モデル制限の読み込みに失敗しました。デフォルト設定を使用します\"," - }, - { - "line": 2145, - "text": "maxValueMsg: \"最大値は $1 です\"," - }, - { - "line": 2146, - "text": "overlapRatioLimit: \"切片サイズの50% ($1) を超えることはできません\"," - }, - { - "line": 2147, - "text": "onlyAdminCanModify: \"システム設定は管理者のみ変更可能です\"," - }, - { - "line": 2148, - "text": "dragToSelect: \"マウスをドラッグして範囲を選択 • ESCでキャンセル\"," - }, - { - "line": 2151, - "text": "fillTargetName: \"対象のナレッジグループ名を入力してください\"," - }, - { - "line": 2152, - "text": "submitFailed: \"送信に失敗しました: $1\"," - }, - { - "line": 2153, - "text": "importFolderTitle: \"ローカルフォルダをインポート\"," - }, - { - "line": 2154, - "text": "importFolderTip: \"ヒント: ローカルフォルダを選択してください。フォルダ内のすべてのサポートされているドキュメントが読み込まれ、アップロードされます。\"," - }, - { - "line": 2155, - "text": "lblTargetGroup: \"対象のナレッジグループ名\"," - }, - { - "line": 2156, - "text": "placeholderNewGroup: \"新規グループ名\"," - }, - { - "line": 2157, - "text": "importToCurrentGroup: \"現在のグループにインポートされます\"," - }, - { - "line": 2158, - "text": "nextStep: \"次へ\"," - }, - { - "line": 2159, - "text": "lblImportSource: \"インポート元\"," - }, - { - "line": 2160, - "text": "serverPath: \"サーバーのパス\"," - }, - { - "line": 2161, - "text": "localFolder: \"ローカルフォルダ\"," - }, - { - "line": 2162, - "text": "selectedFilesCount: \"$1 個のファイルが選択されました\"," - }, - { - "line": 2163, - "text": "clickToSelectFolder: \"クリックしてローカルフォルダを選択\"," - }, - { - "line": 2164, - "text": "selectFolderTip: \"フォルダ内のすべてのサポートされているファイルを読み込みます\"," - }, - { - "line": 2165, - "text": "importComplete: \"インポート完了\"," - }, - { - "line": 2166, - "text": "importedFromLocalFolder: \"ローカルフォルダからインポート: $1\"," - }, - { - "line": 2169, - "text": "historyTitle: \"会話履歴\"," - }, - { - "line": 2170, - "text": "confirmDeleteHistory: \"この会話履歴を削除してもよろしいですか?\"," - }, - { - "line": 2171, - "text": "deleteHistorySuccess: \"会話履歴を削除しました\"," - }, - { - "line": 2172, - "text": "deleteHistoryFailed: \"会話履歴の削除に失敗しました\"," - }, - { - "line": 2173, - "text": "yesterday: \"昨日\"," - }, - { - "line": 2174, - "text": "daysAgo: \"$1日前\"," - }, - { - "line": 2175, - "text": "historyMessages: \"$1 件のメッセージ\"," - }, - { - "line": 2176, - "text": "noHistory: \"会話履歴はありません\"," - }, - { - "line": 2177, - "text": "noHistoryDesc: \"会話を開始して履歴を作成してください\"," - }, - { - "line": 2178, - "text": "loadMore: \"もっと読み込む\"," - }, - { - "line": 2179, - "text": "loadingHistoriesFailed: \"履歴の読み込みに失敗しました\"," - }, - { - "line": 2180, - "text": "supportedFormatsInfo: \"ドキュメント、画像、ソースコードをサポート\"," - }, - { - "line": 2181, - "text": "kbSettingsSaved: \"設定を保存しました\"," - }, - { - "line": 2182, - "text": "failedToSaveSettings: \"設定の保存に失敗しました\"," - }, - { - "line": 2183, - "text": "actionFailed: \"操作に失敗しました\"," - }, - { - "line": 2184, - "text": "userAddedToOrganization: \"ユーザーが組織にAddedされました\"," - }, - { - "line": 2185, - "text": "featureUpdated: \"機能が更新されました\"," - }, - { - "line": 2186, - "text": "roleTenantAdmin: \"テナント管理者\"," - }, - { - "line": 2187, - "text": "roleRegularUser: \"一般ユーザー\"," - }, - { - "line": 2188, - "text": "creatingRegularUser: \"一般ユーザーを作成中\"," - }, - { - "line": 2189, - "text": "editUserRole: \"ユーザーロールを編集\"," - }, - { - "line": 2190, - "text": "targetRole: \"対象のロール\"," - }, - { - "line": 2191, - "text": "editCategory: \"カテゴリを編集\"," - }, - { - "line": 2192, - "text": "totalTenants: \"総テナント数\"," - }, - { - "line": 2193, - "text": "systemUsers: \"システムユーザー\"," - }, - { - "line": 2194, - "text": "systemHealth: \"システムヘルス\"," - }, - { - "line": 2195, - "text": "operational: \"正常稼働中\"," - }, - { - "line": 2196, - "text": "orgManagement: \"組織管理\"," - }, - { - "line": 2197, - "text": "globalTenantControl: \"グローバルテナントコントロール\"," - }, - { - "line": 2198, - "text": "newTenant: \"新規テナント\"," - }, - { - "line": 2199, - "text": "domainOptional: \"ドメイン (任意)\"," - }, - { - "line": 2200, - "text": "saveChanges: \"変更を保存\"," - }, - { - "line": 2201, - "text": "modelConfiguration: \"モデル設定\"," - }, - { - "line": 2202, - "text": "defaultLLMModel: \"デフォルト推論モデル\"," - }, - { - "line": 2203, - "text": "selectLLM: \"LLMを選択\"," - }, - { - "line": 2204, - "text": "selectEmbedding: \"埋め込みを選択\"," - }, - { - "line": 2205, - "text": "rerankModel: \"リランクモデル\"," - }, - { - "line": 2206, - "text": "none: \"なし\"," - }, - { - "line": 2207, - "text": "indexingChunkingConfig: \"インデックスとChunk configuration\"," - }, - { - "line": 2208, - "text": "chatHyperparameters: \"チャットハイパーパラメータ\"," - }, - { - "line": 2209, - "text": "temperature: \"温度\"," - }, - { - "line": 2210, - "text": "precise: \"精密\"," - }, - { - "line": 2211, - "text": "creative: \"クリエイティブ\"," - }, - { - "line": 2212, - "text": "maxResponseTokens: \"最大応答トークン数\"," - }, - { - "line": 2213, - "text": "retrievalSearchSettings: \"検索設定\"," - }, - { - "line": 2215, - "text": "similarityThreshold: \"類似度しきい値\"," - }, - { - "line": 2216, - "text": "enableHybridSearch: \"ハイブリッド検索を有効にする\"," - }, - { - "line": 2217, - "text": "hybridSearchDesc: \"ベクトル検索と全文検索を併用して検索精度を向上させます\"," - }, - { - "line": 2218, - "text": "hybridWeight: \"ハイブリッド重み (0.0=全文, 1.0=ベクトル)\"," - }, - { - "line": 2219, - "text": "pureText: \"純粋なテキスト\"," - }, - { - "line": 2220, - "text": "pureVector: \"純粋なベクトル\"," - }, - { - "line": 2221, - "text": "enableQueryExpansion: \"クエリ拡張を有効にする\"," - }, - { - "line": 2222, - "text": "queryExpansionDesc: \"複数のクエリバリアントを生成してカバレッジを向上させます\"," - }, - { - "line": 2223, - "text": "enableHyDE: \"HyDEを有効にする\"," - }, - { - "line": 2224, - "text": "hydeDesc: \"仮想的な回答を生成してセマンティック検索を改善します\"," - }, - { - "line": 2225, - "text": "enableReranking: \"リランクを有効にする\"," - }, - { - "line": 2226, - "text": "rerankingDesc: \"リランクモデルを使用して結果を再ソートします\"," - }, - { - "line": 2227, - "text": "broad: \"広範\"," - }, - { - "line": 2228, - "text": "strict: \"厳格\"," - }, - { - "line": 2229, - "text": "maxInput: \"最大入力\"," - }, - { - "line": 2230, - "text": "dimensions: \"次元\"," - }, - { - "line": 2231, - "text": "defaultBadge: \"デフォルト\"," - }, - { - "line": 2232, - "text": "dims: \"次元: $1\"," - }, - { - "line": 2233, - "text": "ctx: \"コンテキスト: $1\"," - }, - { - "line": 2235, - "text": "configured: \"設定済み\"," - }, - { - "line": 2236, - "text": "groupUpdated: \"グループが更新されました\"," - }, - { - "line": 2237, - "text": "groupDeleted: \"グループが削除されました\"," - }, - { - "line": 2238, - "text": "groupCreated: \"グループが作成されました\"," - }, - { - "line": 2239, - "text": "navCatalog: \"カタログ\"," - }, - { - "line": 2240, - "text": "allDocuments: \"すべてのドキュメント\"," - }, - { - "line": 2241, - "text": "categories: \"カテゴリ\"," - }, - { - "line": 2242, - "text": "uncategorizedFiles: \"未分類ファイル\"," - }, - { - "line": 2243, - "text": "category: \"カテゴリ\"," - }, - { - "line": 2244, - "text": "statusReadyDesc: \"インデックス済みで検索可能\"," - }, - { - "line": 2245, - "text": "statusIndexingDesc: \"ベクトルインデックスを作成中\"," - }, - { - "line": 2246, - "text": "selectCategory: \"カテゴリを選択\"," - }, - { - "line": 2247, - "text": "noneUncategorized: \"未分類ファイルなし\"," - }, - { - "line": 2248, - "text": "previous: \"前へ\"," - }, - { - "line": 2249, - "text": "next: \"次へ\"," - }, - { - "line": 2250, - "text": "createCategory: \"カテゴリを作成\"," - }, - { - "line": 2251, - "text": "categoryDesc: \"ナレッジカテゴリを説明します\"," - }, - { - "line": 2252, - "text": "categoryName: \"カテゴリ名\"," - }, - { - "line": 2253, - "text": "createCategoryBtn: \"今すぐ作成\"," - }, - { - "line": 2254, - "text": "newGroup: \"新規グループ\"," - }, - { - "line": 2255, - "text": "noKnowledgeGroups: \"ナレッジグループがまだありません\"," - }, - { - "line": 2256, - "text": "createGroupDesc: \"最初のナレッジCreate groupしてドキュメントをアップロードしてください。\"," - }, - { - "line": 2257, - "text": "noDescriptionProvided: \"説明なし\"," - }, - { - "line": 2258, - "text": "browseManageFiles: \"このグループ内のファイルとメモを閲覧・管理します。\"," - }, - { - "line": 2259, - "text": "filterGroupFiles: \"名前でグループ内のファイルを検索...\"," - }, - { - "line": 2260, - "text": "generalSettingsSubtitle: \"アプリケーションの設定を管理します。\"," - }, - { - "line": 2261, - "text": "userManagementSubtitle: \"アクセス権限とアカウントを管理します。\"," - }, - { - "line": 2262, - "text": "modelManagementSubtitle: \"グローバルなAIモデルを設定します。\"," - }, - { - "line": 2263, - "text": "kbSettingsSubtitle: \"インデックス作成とチャットパラメータの技術設定。\"," - }, - { - "line": 2264, - "text": "tenantsSubtitle: \"グローバルシステムの概要。\"," - }, - { - "line": 2265, - "text": "allNotes: \"すべてのノート\"," - }, - { - "line": 2266, - "text": "filterNotesPlaceholder: \"ノートをフィルタリング...\"," - }, - { - "line": 2267, - "text": "startWritingPlaceholder: \"書き始める...\"," - }, - { - "line": 2268, - "text": "previewHeader: \"プレビュー\"," - }, - { - "line": 2269, - "text": "noContentToPreview: \"プレビューするコンテンツがありません\"," - }, - { - "line": 2270, - "text": "hidePreview: \"プレビューを非表示\"," - }, - { - "line": 2271, - "text": "showPreview: \"プレビューを表示\"," - }, - { - "line": 2272, - "text": "directoryLabel: \"ディレクトリ\"," - }, - { - "line": 2273, - "text": "uncategorized: \"未分類\"," - }, - { - "line": 2274, - "text": "enterNamePlaceholder: \"名前を入力...\"," - }, - { - "line": 2275, - "text": "subFolderPlaceholder: \"サブフォルダ...\"," - }, - { - "line": 2276, - "text": "categoryCreated: \"カテゴリが作成されました\"," - }, - { - "line": 2277, - "text": "failedToCreateCategory: \"カテゴリの作成に失敗しました\"," - }, - { - "line": 2278, - "text": "failedToDeleteCategory: \"カテゴリの削除に失敗しました\"," - }, - { - "line": 2279, - "text": "confirmDeleteCategory: \"このカテゴリを削除してもよろしいですか?\"," - }, - { - "line": 2283, - "text": "agentTitle: \"エージェントセンター\"," - }, - { - "line": 2284, - "text": "agentDesc: \"複雑なタスクを支援する AI アシスタントを管理および実行します。\"," - }, - { - "line": 2285, - "text": "createAgent: \"エージェント作成\"," - }, - { - "line": 2286, - "text": "searchAgent: \"エージェントを検索...\"," - }, - { - "line": 2287, - "text": "statusRunning: \"実行中\"," - }, - { - "line": 2288, - "text": "statusStopped: \"停止中\"," - }, - { - "line": 2289, - "text": "updatedAtPrefix: \"最終更新日: \"," - }, - { - "line": 2290, - "text": "btnChat: \"会話を開始\"," - }, - { - "line": 2293, - "text": "agent1Name: \"データ分析エキスパート\"," - }, - { - "line": 2294, - "text": "agent1Desc: \"SQL とデータ視覚化に精通し、複雑なデータから洞察を抽出できます。\"," - }, - { - "line": 2295, - "text": "agent2Name: \"コードレビュー助手\"," - }, - { - "line": 2296, - "text": "agent2Desc: \"コードの品質を自動的にチェックし、リファクタリングの提案やパフォーマンス最適化案を提供します。\"," - }, - { - "line": 2297, - "text": "agent3Name: \"学術論文校閲\"," - }, - { - "line": 2298, - "text": "agent3Desc: \"専門的な学術ライティングアシスタント。論文の構成と表現の最適化を支援します。\"," - }, - { - "line": 2299, - "text": "agent4Name: \"法律顧問\"," - }, - { - "line": 2300, - "text": "agent4Desc: \"法律条文の検索や基本的な法的アドバイスを提供し、契約書の作成を支援します。\"," - }, - { - "line": 2301, - "text": "agent5Name: \"市場調査員\"," - }, - { - "line": 2302, - "text": "agent5Desc: \"業界のトレンドを分析し、競合他社の調査レポートを生成します。\"," - }, - { - "line": 2303, - "text": "agent6Name: \"システム運用保守エキスパート\"," - }, - { - "line": 2304, - "text": "agent6Desc: \"システムの健康状態を監視し、一般的なアラートへの対応やトラブルシューティングを自動化します。\"," - }, - { - "line": 2305, - "text": "agent7Name: \"財務監査人\"," - }, - { - "line": 2306, - "text": "agent7Desc: \"レポート監査を自動化し、財務リスクや異常な取引を特定します。\"," - }, - { - "line": 2307, - "text": "agent1Time: \"2 時間前\"," - }, - { - "line": 2308, - "text": "agent2Time: \"5 時間前\"," - }, - { - "line": 2309, - "text": "agent3Time: \"昨日\"," - }, - { - "line": 2310, - "text": "agent4Time: \"2 日前\"," - }, - { - "line": 2311, - "text": "agent5Time: \"3 日前\"," - }, - { - "line": 2312, - "text": "agent6Time: \"5 日前\"," - }, - { - "line": 2313, - "text": "agent7Time: \"1 週間前\"," - }, - { - "line": 2316, - "text": "pluginTitle: \"プラグインストア\"," - }, - { - "line": 2317, - "text": "pluginDesc: \"外部ツールやサービスを統合して、ナレッジベースの機能を拡張します。\"," - }, - { - "line": 2318, - "text": "searchPlugin: \"プラグインを検索...\"," - }, - { - "line": 2319, - "text": "installPlugin: \"インストール\"," - }, - { - "line": 2320, - "text": "installedPlugin: \"インストール済み\"," - }, - { - "line": 2321, - "text": "updatePlugin: \"アップデートあり\"," - }, - { - "line": 2322, - "text": "pluginOfficial: \"公式\"," - }, - { - "line": 2323, - "text": "pluginCommunity: \"コミュニティ\"," - }, - { - "line": 2324, - "text": "pluginBy: \"開発者: \"," - }, - { - "line": 2325, - "text": "pluginConfig: \"設定\"," - }, - { - "line": 2328, - "text": "plugin1Name: \"Web 検索\"," - }, - { - "line": 2329, - "text": "plugin1Desc: \"最新情報を取得するために、AI にインターネットへのリアルタイムアクセスを提供します。\"," - }, - { - "line": 2330, - "text": "plugin2Name: \"PDF ドキュメント解析\"," - }, - { - "line": 2331, - "text": "plugin2Desc: \"複雑な PDF レイアウトを詳細に解析し、表や数式を抽出します。\"," - }, - { - "line": 2332, - "text": "plugin3Name: \"GitHub 連携\"," - }, - { - "line": 2333, - "text": "plugin3Desc: \"GitHub リポジトリに直接アクセスし、コードのコミットやイシュー管理を行います。\"," - }, - { - "line": 2334, - "text": "plugin4Name: \"Google カレンダー\"," - }, - { - "line": 2335, - "text": "plugin4Desc: \"スケジュールを同期し、会議のリマインダーを自動的に作成します。\"," - }, - { - "line": 2336, - "text": "plugin5Name: \"SQL データベース接続\"," - }, - { - "line": 2337, - "text": "plugin5Desc: \"データベースに安全に接続し、自然語言でクエリを実行します。\"," - }, - { - "line": 2338, - "text": "plugin6Name: \"Slack 通知\"," - }, - { - "line": 2339, - "text": "plugin6Desc: \"AI が生成したレポートを指定された Slack チャンネルに直接送信します。\"," - }, - { - "line": 2341, - "text": "navTenants: \"テナント管理\"," - }, - { - "line": 2342, - "text": "noNotesFound: \"ノートが見つかりません\"," - }, - { - "line": 2343, - "text": "notebookDesc: \"ノートブックは知識の整理と要約に役立ちます。\"," - }, - { - "line": 2344, - "text": "personalNotebook: \"個人用ノートブック\"," - }, - { - "line": 2345, - "text": "warning: \"警告\"," - }, - { - "line": 2346, - "text": "\"x-api-key\": \"APIキー\"," - }, - { - "line": 2347, - "text": "\"x-tenant-id\": \"テナントID\"," - }, - { - "line": 2348, - "text": "\"x-user-language\": \"ユーザー言語\"," - }, - { - "line": 2351, - "text": "addSubcategory: \"サブカテゴリをAdded\"," - }, - { - "line": 2352, - "text": "parentCategory: \"親カテゴリ(任意)\"," - }, - { - "line": 2353, - "text": "noParentTopLevel: \"なし(トップレベル)\"," - }, - { - "line": 2354, - "text": "useHierarchyImport: \"フォルダ階層でカテゴリを作成\"," - }, - { - "line": 2355, - "text": "useHierarchyImportDesc: \"有効にすると、各サブフォルダにサブカテゴリが作成され、ファイルが対応するカテゴリにインポートされます。\"," - }, - { - "line": 2358, - "text": "importImmediate: \"今すぐインポート\"," - }, - { - "line": 2359, - "text": "importScheduled: \"スケジュールインポート\"," - }, - { - "line": 2360, - "text": "lblServerPath: \"サーバーフォルダパス\"," - }, - { - "line": 2361, - "text": "placeholderServerPath: \"例: /data/documents\"," - }, - { - "line": 2362, - "text": "scheduledImportTip: \"サーバー側のスケジュールインポート:指定した時刻にサーバーがパスのファイルを読み込んで自動インポートします。サーバーがそのパスにアクセスできることを確認してください。\"," - }, - { - "line": 2363, - "text": "lblScheduledTime: \"実行日時\"," - }, - { - "line": 2364, - "text": "scheduledTimeHint: \"指定した時刻に、サーバーが自動的にインポートタスクを実行します。\"," - }, - { - "line": 2365, - "text": "scheduleImport: \"スケジュールタスクを作成\"," - }, - { - "line": 2366, - "text": "scheduleTaskCreated: \"スケジュールインポートタスクが作成されました\"," - }, - { - "line": 2367, - "text": "fillServerPath: \"サーバーフォルダパスを入力してください\"," - }, - { - "line": 2368, - "text": "invalidDateTime: \"有効な日付と時刻を入力してください\"," - }, - { - "line": 2371, - "text": "importTasksTitle: \"定期計画\"," - }, - { - "line": 2372, - "text": "noTasksFound: \"タスクは見つかりませんでした\"," - }, - { - "line": 2373, - "text": "sourcePath: \"ソースパス\"," - }, - { - "line": 2374, - "text": "targetGroup: \"ターゲットグループ\"," - }, - { - "line": 2375, - "text": "scheduledAt: \"実行予定日時\"," - }, - { - "line": 2376, - "text": "confirmDeleteTask: \"このインポートタスクレコードを削除してもよろしいですか?\"," - }, - { - "line": 2377, - "text": "deleteTaskFailed: \"タスクレコードの削除に失敗しました\"," - } - ], - "d:\\workspace\\AuraK\\server\\src\\chat\\chat.controller.ts": [ - { - "line": 94, - "text": "console.log('Final LLM model used (default):', llmModel ? llmModel.name : '无');" - } - ], - "d:\\workspace\\AuraK\\server\\src\\i18n\\i18n.service.ts": [ - { - "line": 7, - "text": "private readonly defaultLanguage = 'ja'; // プロジェクト要件に従い、Japaneseをデフォルトとして使用" - }, - { - "line": 30, - "text": "// 汎用メッセージ取得メソッド、順次検索" - }, - { - "line": 33, - "text": "// ステータスメッセージ、エラーメッセージ、ログメッセージの順に検索" - }, - { - "line": 43, - "text": "// メッセージの取得とフォーマット" - }, - { - "line": 52, - "text": "// サポートされている言語リストを取得" - }, - { - "line": 57, - "text": "// 言語がサポートされているか確認" - }, - { - "line": 62, - "text": "// システムプロンプトを取得" - }, - { - "line": 69, - "text": "基于以下知识库内容回答用户问题。" - }, - { - "line": 71, - "text": "**重要提示**: 用户已选择特定知识组,请严格基于以下知识库内容回答。如果知识库中没有相关信息,请明确告知用户:\"${noMatchMsg}\",然后再提供答案。" - }, - { - "line": 73, - "text": "知识库内容:" - }, - { - "line": 76, - "text": "历史对话:" - }, - { - "line": 79, - "text": "用户问题:{question}" - }, - { - "line": 81, - "text": "请用Chinese回答,并严格遵循以下 Markdown 格式要求:" - }, - { - "line": 83, - "text": "1. **段落与结构**:" - }, - { - "line": 84, - "text": "- 使用清晰的段落分隔,每个要点之间空一行" - }, - { - "line": 85, - "text": "- 使用标题(## 或 ###)组织长回答" - }, - { - "line": 87, - "text": "2. **文本格式**:" - }, - { - "line": 88, - "text": "- 使用 **粗体** 强调重要概念和关键词" - }, - { - "line": 89, - "text": "- 使用列表(- 或 1.)组织多个要点" - }, - { - "line": 90, - "text": "- 使用 \\`代码\\` 标记技术术语、命令、文件名" - }, - { - "line": 92, - "text": "3. **代码展示**:" - }, - { - "line": 93, - "text": "- 使用代码块展示代码,并指定语言:" - }, - { - "line": 96, - "text": "return \"示例\"" - }, - { - "line": 98, - "text": "- 支持语言:python, javascript, typescript, java, bash, sql 等" - }, - { - "line": 100, - "text": "4. **图表与可视化**:" - }, - { - "line": 101, - "text": "- 使用 Mermaid 语法绘制流程图、序列图等:" - }, - { - "line": 104, - "text": "A[开始] --> B[处理]" - }, - { - "line": 105, - "text": "B --> C[结束]" - }, - { - "line": 107, - "text": "- 适用场景:流程、架构、状态机、时序图" - }, - { - "line": 109, - "text": "5. **其他要求**:" - }, - { - "line": 110, - "text": "- 回答精炼准确" - }, - { - "line": 111, - "text": "- 多步骤操作使用有序列表" - }, - { - "line": 112, - "text": "- 对比类信息建议用表格展示(如果适用)" - }, - { - "line": 114, - "text": "作为智能助手,请回答用户的问题。" - }, - { - "line": 116, - "text": "历史对话:" - }, - { - "line": 119, - "text": "用户问题:{question}" - }, - { - "line": 121, - "text": "请用Chinese回答。" - }, - { - "line": 179, - "text": "} else { // 默认为日语,符合项目要求" - }, - { - "line": 181, - "text": "以下のナレッジベースの内容に基づいてユーザーの質問に答えてください。" - }, - { - "line": 183, - "text": "**重要**: ユーザーが特定の知識グループを選択しました。以下のナレッジベースの内容に厳密に基づいて回答してください。ナレッジベースに関連情報がない場合は、「${noMatchMsg}」とユーザーに明示的に伝えてから、回答を提供してください。" - }, - { - "line": 185, - "text": "ナレッジベースの内容:" - }, - { - "line": 188, - "text": "会話履歴:" - }, - { - "line": 191, - "text": "ユーザーの質問:{question}" - }, - { - "line": 193, - "text": "Japaneseで回答してください。以下の Markdown 書式要件に厳密に従ってください:" - }, - { - "line": 195, - "text": "1. **段落と構造**:" - }, - { - "line": 196, - "text": "- 明確な段落分けを使用し、要点間に空行を入れる" - }, - { - "line": 197, - "text": "- 長い回答には見出し(## または ###)を使用" - }, - { - "line": 199, - "text": "2. **テキスト書式**:" - }, - { - "line": 200, - "text": "- 重要な概念やキーワードを強調するために **太字** を使用" - }, - { - "line": 201, - "text": "- 複数のポイントを整理するためにリスト(- または 1.)を使用" - }, - { - "line": 202, - "text": "- 技術用語、コマンド、ファイル名をマークするために \\`コード\\` を使用" - }, - { - "line": 204, - "text": "3. **コード表示**:" - }, - { - "line": 205, - "text": "- 言語を指定してコードブロックを使用:" - }, - { - "line": 208, - "text": "return \"例\"" - }, - { - "line": 210, - "text": "- 対応言語:python, javascript, typescript, java, bash, sql など" - }, - { - "line": 212, - "text": "4. **図表とチャート**:" - }, - { - "line": 213, - "text": "- フローチャート、シーケンス図などに Mermaid 構文を使用:" - }, - { - "line": 216, - "text": "A[開始] --> B[処理]" - }, - { - "line": 217, - "text": "B --> C[終了]" - }, - { - "line": 219, - "text": "- 使用例:プロセスフロー、アーキテクチャ図、状態図、シーケンス図" - }, - { - "line": 221, - "text": "5. **その他の要件**:" - }, - { - "line": 222, - "text": "- 簡潔で明確な回答を心がける" - }, - { - "line": 223, - "text": "- 複数のステップがある場合は番号付きリストを使用" - }, - { - "line": 224, - "text": "- 比較情報には表を使用(該当する場合)" - }, - { - "line": 226, - "text": "インテリジェントアシスタントとして、ユーザーの質問に答えてください。" - }, - { - "line": 228, - "text": "会話履歴:" - }, - { - "line": 231, - "text": "ユーザーの質問:{question}" - }, - { - "line": 232, - "text": "Japaneseで回答してください。" - }, - { - "line": 237, - "text": "// タイトル生成用のプロンプトを取得" - }, - { - "line": 241, - "text": "return `你是一个文档分析师。请阅读以下文本(文档开Header分),并生成一个简炼、专业的标题(不超过50个字符)。" - }, - { - "line": 242, - "text": "只返回标题文本。不要包含任何解释性文字或前导词(如“标题是:”)。" - }, - { - "line": 243, - "text": "语言:Chinese" - }, - { - "line": 244, - "text": "文本内容:" - }, - { - "line": 253, - "text": "return `あなたはドキュメントアナライザーです。以下のテキスト(ドキュメントの冒頭部分)を読み、簡潔でプロフェッショナルなタイトル(最大50文字)を生成してください。" - }, - { - "line": 254, - "text": "タイトルテキストのみを返してください。説明文や前置き(例:「タイトルは:」)は含めないでください。" - }, - { - "line": 255, - "text": "言語:Japanese" - }, - { - "line": 256, - "text": "テキスト:" - }, - { - "line": 264, - "text": "return `根据以下对话片段,生成一个简短、描述性的标题(不超过50个字符),总结讨论的主题。" - }, - { - "line": 265, - "text": "只返回标题文本。不要包含任何前导词。" - }, - { - "line": 266, - "text": "语言:Chinese" - }, - { - "line": 267, - "text": "片段:" - }, - { - "line": 268, - "text": "用户: ${userMessage}" - }, - { - "line": 269, - "text": "助手: ${aiResponse}`;" - }, - { - "line": 278, - "text": "return `以下の会話スニペットに基づいて、トピックを要約する短く説明的なタイトル(最大50文字)を生成してください。" - }, - { - "line": 279, - "text": "タイトルのみを返してください。前置きは不要です。" - }, - { - "line": 280, - "text": "言語:Japanese" - }, - { - "line": 281, - "text": "スニペット:" - }, - { - "line": 282, - "text": "ユーザー: ${userMessage}" - }, - { - "line": 283, - "text": "アシスタント: ${aiResponse}`;" - } - ], - "d:\\workspace\\AuraK\\server\\src\\i18n\\messages.ts": [ - { - "line": 3, - "text": "noEmbeddingModel: '请先在系统设置中配置嵌入模型'," - }, - { - "line": 4, - "text": "searchFailed: '搜索知识库失败,将基于一般知识回答...'," - }, - { - "line": 5, - "text": "invalidApiKey: 'API密钥无效'," - }, - { - "line": 6, - "text": "fileNotFound: '未找到文件'," - }, - { - "line": 7, - "text": "insufficientQuota: '配额不足'," - }, - { - "line": 8, - "text": "modelNotConfigured: '未配置模型'," - }, - { - "line": 9, - "text": "visionModelNotConfigured: '未配置视觉模型'," - }, - { - "line": 10, - "text": "embeddingDimensionMismatch: '嵌入维度不匹配'," - }, - { - "line": 11, - "text": "uploadNoFile: '未上传文件'," - }, - { - "line": 12, - "text": "uploadSizeExceeded: '文件大小超过限制: {size}, 最大允许: {max}'," - }, - { - "line": 13, - "text": "uploadModelRequired: '必须选择嵌入模型'," - }, - { - "line": 14, - "text": "uploadTypeUnsupported: '不支持的文件格式: {type}'," - }, - { - "line": 15, - "text": "chunkOverflow: '切片大小 {size} 超过上限 {max} ({reason})。已自动调整'," - }, - { - "line": 16, - "text": "chunkUnderflow: '切片大小 {size} 小于最小值 {min}。已自动调整'," - }, - { - "line": 17, - "text": "overlapOverflow: '重叠大小 {size} 超过上限 {max}。已自动调整'," - }, - { - "line": 18, - "text": "overlapUnderflow: '重叠大小 {size} 小于最小值 {min}。已自动调整'," - }, - { - "line": 19, - "text": "overlapRatioExceeded: '重叠大小 {size} 超过切片大小的50% ({max})。已自动调整'," - }, - { - "line": 20, - "text": "batchOverflowWarning: '建议切片大小不超过 {safeSize} 以避免批量处理溢出 (当前: {size}, 模型限制的 {percent}%)'," - }, - { - "line": 21, - "text": "estimatedChunkCountExcessive: '预计切片数量过多 ({count}),处理可能较慢'," - }, - { - "line": 22, - "text": "contentAndTitleRequired: '内容和标题为必填项'," - }, - { - "line": 23, - "text": "embeddingModelNotFound: '找不到嵌入模型 {id} 或类型不是 embedding'," - }, - { - "line": 24, - "text": "ocrFailed: '提取文本失败: {message}'," - }, - { - "line": 25, - "text": "noImageUploaded: '未上传图片'," - }, - { - "line": 26, - "text": "adminOnlyViewList: '只有管理员可以查看用户列表'," - }, - { - "line": 27, - "text": "passwordsRequired: '当前密码和新密码不能为空'," - }, - { - "line": 28, - "text": "newPasswordMinLength: '新密码长度不能少于6位'," - }, - { - "line": 29, - "text": "adminOnlyCreateUser: '只有管理员可以创建用户'," - }, - { - "line": 30, - "text": "usernamePasswordRequired: '用户名和密码不能为空'," - }, - { - "line": 31, - "text": "passwordMinLength: '密码长度不能少于6位'," - }, - { - "line": 32, - "text": "adminOnlyUpdateUser: '只有管理员可以更新用户信息'," - }, - { - "line": 33, - "text": "userNotFound: '用户不存在'," - }, - { - "line": 34, - "text": "cannotModifyBuiltinAdmin: '无法修改内置管理员账户'," - }, - { - "line": 35, - "text": "adminOnlyDeleteUser: '只有管理员可以删除用户'," - }, - { - "line": 36, - "text": "cannotDeleteSelf: '不能删除自己的账户'," - }, - { - "line": 37, - "text": "cannotDeleteBuiltinAdmin: '无法删除内置管理员账户'," - }, - { - "line": 38, - "text": "incorrectCredentials: '用户名或密码不正确'," - }, - { - "line": 39, - "text": "incorrectCurrentPassword: '当前密码错误'," - }, - { - "line": 40, - "text": "usernameExists: '用户名已存在'," - }, - { - "line": 41, - "text": "noteNotFound: '找不到笔记: {id}'," - }, - { - "line": 42, - "text": "knowledgeGroupNotFound: '找不到知识组: {id}'," - }, - { - "line": 43, - "text": "accessDeniedNoToken: '访问被拒绝:缺少令牌'," - }, - { - "line": 44, - "text": "invalidToken: '无效的令牌'," - }, - { - "line": 45, - "text": "pdfFileNotFound: '找不到 PDF 文件'," - }, - { - "line": 46, - "text": "pdfFileEmpty: 'PDF 文件为空,转换可能失败'," - }, - { - "line": 47, - "text": "pdfConversionFailed: 'PDF 文件不存在或转换失败'," - }, - { - "line": 48, - "text": "pdfConversionFailedDetail: 'PDF 转换失败(文件 ID: {id}),请稍后重试'," - }, - { - "line": 49, - "text": "pdfPreviewNotSupported: '该文件格式不支持预览'," - }, - { - "line": 50, - "text": "pdfServiceUnavailable: 'PDF 服务不可用: {message}'," - }, - { - "line": 51, - "text": "pageImageNotFound: '找不到页面图像'," - }, - { - "line": 52, - "text": "pdfPageImageFailed: '无法获取 PDF 页面图像'," - }, - { - "line": 53, - "text": "someGroupsNotFound: '部分组不存在'," - }, - { - "line": 54, - "text": "promptRequired: '提示词是必填项'," - }, - { - "line": 55, - "text": "addLLMConfig: '请在系统设置中添加 LLM 模型'," - }, - { - "line": 56, - "text": "visionAnalysisFailed: '视觉分析失败: {message}'," - }, - { - "line": 57, - "text": "retryMechanismError: '重试机制异常'," - }, - { - "line": 58, - "text": "imageLoadError: '无法读取图像: {message}'," - }, - { - "line": 59, - "text": "groupNotFound: '分组不存在'," - }, - { - "line": 62, - "text": "noEmbeddingModel: '先にシステム設定で埋め込みモデルを設定してください'," - }, - { - "line": 63, - "text": "searchFailed: 'ナレッジベース検索に失敗しました。一般的な知識に基づいて回答します...'," - }, - { - "line": 64, - "text": "invalidApiKey: 'APIキーが無効です'," - }, - { - "line": 65, - "text": "fileNotFound: 'ファイルが見つかりません'," - }, - { - "line": 66, - "text": "insufficientQuota: '利用枠が不足しています'," - }, - { - "line": 67, - "text": "modelNotConfigured: 'モデルが設定されていません'," - }, - { - "line": 68, - "text": "visionModelNotConfigured: 'ビジョンモデルが設定されていません'," - }, - { - "line": 69, - "text": "embeddingDimensionMismatch: '埋め込み次元数が一致しません'," - }, - { - "line": 70, - "text": "uploadNoFile: 'ファイルがアップロードされていません'," - }, - { - "line": 71, - "text": "uploadSizeExceeded: 'ファイルサイズが制限: {size}, 最大許容: {max}'," - }, - { - "line": 72, - "text": "uploadModelRequired: '埋め込みモデルを選択する必要があります'," - }, - { - "line": 73, - "text": "uploadTypeUnsupported: 'サポートされていないファイル形式です: {type}'," - }, - { - "line": 74, - "text": "chunkOverflow: 'Chunk size {size} exceeds limit {max} ({reason}) 。自動調整されました'," - }, - { - "line": 75, - "text": "chunkUnderflow: 'Chunk size {size} is below minimum {min} 。自動調整されました'," - }, - { - "line": 76, - "text": "overlapOverflow: '重なりサイズ {size} exceeds limit {max} 。自動調整されました'," - }, - { - "line": 77, - "text": "overlapUnderflow: '重なりサイズ {size} is below minimum {min} 。自動調整されました'," - }, - { - "line": 78, - "text": "overlapRatioExceeded: '重なりサイズ {size} がChunk sizeの50% ({max}) 。自動調整されました'," - }, - { - "line": 79, - "text": "batchOverflowWarning: 'バッチ処理のオーバーフローを避けるため、Chunk sizeを {safeSize} 以下にすることをお勧めします (現在: {size}, モデル制限の {percent}%)'," - }, - { - "line": 80, - "text": "estimatedChunkCountExcessive: '推定チャンク数が多すぎます ({count})。処理に時間がかかる可能性があります'," - }, - { - "line": 81, - "text": "contentAndTitleRequired: '内容とタイトルは必須です'," - }, - { - "line": 82, - "text": "embeddingModelNotFound: '埋め込みモデル {id} が見つかりません、またはタイプが embedding ではありません'," - }, - { - "line": 83, - "text": "ocrFailed: 'テキストの抽出に失敗しました: {message}'," - }, - { - "line": 84, - "text": "noImageUploaded: '画像がアップロードされていません'," - }, - { - "line": 85, - "text": "adminOnlyViewList: '管理者のみがユーザーリストを表示できます'," - }, - { - "line": 86, - "text": "passwordsRequired: '現在のパスワードと新しいパスワードは必須です'," - }, - { - "line": 87, - "text": "newPasswordMinLength: '新しいパスワードは少なくとも6文字以上である必要があります'," - }, - { - "line": 88, - "text": "adminOnlyCreateUser: '管理者のみがユーザーを作成できます'," - }, - { - "line": 89, - "text": "usernamePasswordRequired: 'ユーザー名とパスワードは必須です'," - }, - { - "line": 90, - "text": "passwordMinLength: 'パスワードは少なくとも6文字以上である必要があります'," - }, - { - "line": 91, - "text": "adminOnlyUpdateUser: '管理者のみがユーザー情報を更新できます'," - }, - { - "line": 92, - "text": "userNotFound: 'ユーザーが見つかりません'," - }, - { - "line": 93, - "text": "cannotModifyBuiltinAdmin: 'ビルトイン管理者アカウントを変更できません'," - }, - { - "line": 94, - "text": "adminOnlyDeleteUser: '管理者のみがユーザーを削除できます'," - }, - { - "line": 95, - "text": "cannotDeleteSelf: '自分自身のアカウントを削除できません'," - }, - { - "line": 96, - "text": "cannotDeleteBuiltinAdmin: 'ビルトイン管理者アカウントを削除できません'," - }, - { - "line": 97, - "text": "incorrectCredentials: 'ユーザー名またはパスワードが間違っています'," - }, - { - "line": 98, - "text": "incorrectCurrentPassword: '現在のパスワードが間違っています'," - }, - { - "line": 99, - "text": "usernameExists: 'ユーザー名が既に存在します'," - }, - { - "line": 100, - "text": "noteNotFound: 'ノートが見つかりません: {id}'," - }, - { - "line": 101, - "text": "knowledgeGroupNotFound: 'ナレッジグループが見つかりません: {id}'," - }, - { - "line": 102, - "text": "accessDeniedNoToken: 'アクセス不許可:トークンがありません'," - }, - { - "line": 103, - "text": "invalidToken: '無効なトークンです'," - }, - { - "line": 104, - "text": "pdfFileNotFound: 'PDF ファイルが見つかりません'," - }, - { - "line": 105, - "text": "pdfFileEmpty: 'PDF ファイルが空です。変換に失敗した可能性があります'," - }, - { - "line": 106, - "text": "pdfConversionFailed: 'PDF ファイルが存在しないか、変換に失敗しました'," - }, - { - "line": 107, - "text": "pdfConversionFailedDetail: 'PDF 変換に失敗しました(ファイル ID: {id})。後でもう一度お試しください'," - }, - { - "line": 108, - "text": "pdfPreviewNotSupported: 'このファイル形式はプレビューをサポートしていません'," - }, - { - "line": 109, - "text": "pdfServiceUnavailable: 'PDF サービスを利用できません: {message}'," - }, - { - "line": 110, - "text": "pageImageNotFound: 'ページ画像が見つかりません'," - }, - { - "line": 111, - "text": "pdfPageImageFailed: 'PDF ページの画像を取得できませんでした'," - }, - { - "line": 112, - "text": "someGroupsNotFound: '一部のグループが存在しません'," - }, - { - "line": 113, - "text": "promptRequired: 'プロンプトは必須です'," - }, - { - "line": 114, - "text": "addLLMConfig: 'システム設定で LLM モデルをAddedしてください'," - }, - { - "line": 115, - "text": "visionAnalysisFailed: 'ビジョン分析に失敗しました: {message}'," - }, - { - "line": 116, - "text": "retryMechanismError: '再試行メカニズムの異常'," - }, - { - "line": 117, - "text": "imageLoadError: '画像を読み込めません: {message}'," - }, - { - "line": 118, - "text": "groupNotFound: 'グループが存在しません'," - }, - { - "line": 184, - "text": "processingFile: '处理文件: {name} ({size})'," - }, - { - "line": 185, - "text": "indexingComplete: '索引完成: {id}'," - }, - { - "line": 186, - "text": "vectorizingFile: '向量化文件: '," - }, - { - "line": 187, - "text": "searchQuery: '搜索查询: '," - }, - { - "line": 188, - "text": "modelCall: '[模型调用] 类型: {type}, 模型: {model}, 用户: {user}'," - }, - { - "line": 189, - "text": "memoryStatus: '内存状态: '," - }, - { - "line": 190, - "text": "uploadSuccess: '文件上传成功。正在后台索引'," - }, - { - "line": 191, - "text": "overlapAdjusted: '重叠大小超过切片大小的50%。已自动调整为 {newSize}'," - }, - { - "line": 192, - "text": "environmentLimit: '环境变量限制'," - }, - { - "line": 193, - "text": "modelLimit: '模型限制'," - }, - { - "line": 194, - "text": "configLoaded: '数据库模型配置加载: {name} ({id})'," - }, - { - "line": 195, - "text": "batchSizeAdjusted: '批量大小从 {old} 调整为 {new} (模型限制: {limit})'," - }, - { - "line": 196, - "text": "dimensionMismatch: '模型 {id} 维度不匹配: 预期 {expected}, 实际 {actual}'," - }, - { - "line": 197, - "text": "searchMetadataFailed: '为用户 {userId} 搜索知识库失败'," - }, - { - "line": 198, - "text": "extractedTextTooLarge: '抽出されたテキストが大きいです: {size}MB'," - }, - { - "line": 199, - "text": "preciseModeUnsupported: '格式 {ext} 不支持精密模式,回退到快速模式'," - }, - { - "line": 200, - "text": "visionModelNotConfiguredFallback: '未配置视觉模型,回退到快速模式'," - }, - { - "line": 201, - "text": "visionModelInvalidFallback: '视觉模型配置无效,回退到快速模式'," - }, - { - "line": 202, - "text": "visionPipelineFailed: '视觉流水线失败,回退到快速模式'," - }, - { - "line": 203, - "text": "preciseModeComplete: '精密模式提取完成: {pages}页, 费用: ${cost}'," - }, - { - "line": 204, - "text": "skippingEmptyVectorPage: '跳过第 {page} 页(空向量)'," - }, - { - "line": 205, - "text": "pdfPageImageError: '获取 PDF 页面图像失败: {message}'," - }, - { - "line": 206, - "text": "internalServerError: '服务器内部错误'," - }, - { - "line": 209, - "text": "processingFile: 'ファイル処理中: {name} ({size})'," - }, - { - "line": 210, - "text": "indexingComplete: 'インデックス完了: {id}'," - }, - { - "line": 211, - "text": "vectorizingFile: 'ファイルベクトル化中: '," - }, - { - "line": 212, - "text": "searchQuery: '検索クエリ: '," - }, - { - "line": 213, - "text": "modelCall: '[モデル呼び出し] タイプ: {type}, Model: {model}, ユーザー: {user}'," - }, - { - "line": 214, - "text": "memoryStatus: 'メモリ状態: '," - }, - { - "line": 215, - "text": "uploadSuccess: 'ファイルが正常にアップロードされました。バックグラウンドでインデックス処理を実行中です'," - }, - { - "line": 216, - "text": "overlapAdjusted: 'オーバーラップサイズがChunk sizeの50%。自動的に {newSize} に調整されました'," - }, - { - "line": 217, - "text": "environmentLimit: '環境変数の制限'," - }, - { - "line": 218, - "text": "modelLimit: 'モデルの制限'," - }, - { - "line": 219, - "text": "configLoaded: 'データベースからモデル設定を読み込みました: {name} ({id})'," - }, - { - "line": 220, - "text": "batchSizeAdjusted: 'バッチサイズを {old} から {new} に調整しました (モデル制限: {limit})'," - }, - { - "line": 221, - "text": "dimensionMismatch: 'モデル {id} の次元が一致しません: 期待値 {expected}, 実際 {actual}'," - }, - { - "line": 222, - "text": "searchMetadataFailed: 'ユーザー {userId} のナレッジベース検索に失敗しました'," - }, - { - "line": 223, - "text": "extractedTextTooLarge: '抽出されたテキストが大きいです: {size}MB'," - }, - { - "line": 224, - "text": "preciseModeUnsupported: 'ファイル形式 {ext} はPrecise Modeをサポートしていません。Fast Modeにフォールバックします'," - }, - { - "line": 225, - "text": "visionModelNotConfiguredFallback: 'ビジョンモデルが設定されていません。Fast Modeにフォールバックします'," - }, - { - "line": 226, - "text": "visionModelInvalidFallback: 'ビジョンモデルの設定が無効です。Fast Modeにフォールバックします'," - }, - { - "line": 227, - "text": "visionPipelineFailed: 'ビジョンパイプラインが失敗しました。Fast Modeにフォールバックします'," - }, - { - "line": 228, - "text": "preciseModeComplete: 'Precise Mode内容抽出完了: {pages}ページ, コスト: ${cost}'," - }, - { - "line": 229, - "text": "skippingEmptyVectorPage: '第 {page} ページの空ベクトルをスキップします'," - }, - { - "line": 230, - "text": "pdfPageImageError: 'PDF ページの画像取得に失敗しました: {message}'," - }, - { - "line": 231, - "text": "internalServerError: 'サーバー内部エラー'," - }, - { - "line": 262, - "text": "searching: '正在搜索知识库...'," - }, - { - "line": 263, - "text": "noResults: '未找到相关知识,将基于一般知识回答...'," - }, - { - "line": 264, - "text": "searchFailed: '知识库搜索失败,将基于一般知识回答...'," - }, - { - "line": 265, - "text": "generatingResponse: '正在生成回答'," - }, - { - "line": 267, - "text": "notebooks: '个笔记本'," - }, - { - "line": 268, - "text": "all: '全部'," - }, - { - "line": 269, - "text": "items: '个'," - }, - { - "line": 270, - "text": "searchResults: '搜索结果'," - }, - { - "line": 271, - "text": "relevantInfoFound: '条相关信息找到'," - }, - { - "line": 272, - "text": "searchHits: '搜索命中'," - }, - { - "line": 273, - "text": "relevance: '相关度'," - }, - { - "line": 274, - "text": "sourceFiles: '源文件'," - }, - { - "line": 275, - "text": "searchScope: '搜索范围'," - }, - { - "line": 276, - "text": "error: '错误'," - }, - { - "line": 277, - "text": "creatingHistory: '创建新对话历史: '," - }, - { - "line": 278, - "text": "searchingModelById: '根据ID搜索模型: '," - }, - { - "line": 279, - "text": "searchModelFallback: '未找到指定的嵌入模型。使用第一个可用模型。'," - }, - { - "line": 280, - "text": "noEmbeddingModelFound: '找不到嵌入模型设置'," - }, - { - "line": 281, - "text": "usingEmbeddingModel: '使用的嵌入模型: '," - }, - { - "line": 282, - "text": "startingSearch: '开始搜索知识库...'," - }, - { - "line": 283, - "text": "searchResultsCount: '搜索结果数: '," - }, - { - "line": 284, - "text": "searchFailedLog: '搜索失败'," - }, - { - "line": 285, - "text": "modelCall: '[模型调用]'," - }, - { - "line": 286, - "text": "chatStreamError: '聊天流错误'," - }, - { - "line": 287, - "text": "assistStreamError: '辅助流错误'," - }, - { - "line": 288, - "text": "file: '文件'," - }, - { - "line": 289, - "text": "content: '内容'," - }, - { - "line": 290, - "text": "userLabel: '用户'," - }, - { - "line": 291, - "text": "assistantLabel: '助手'," - }, - { - "line": 292, - "text": "intelligentAssistant: '您是智能写作助手。'," - }, - { - "line": 293, - "text": "searchString: '搜索字符串: '," - }, - { - "line": 294, - "text": "embeddingModelIdNotProvided: '未提供嵌入模型ID'," - }, - { - "line": 295, - "text": "generatingEmbeddings: '生成嵌入向量...'," - }, - { - "line": 296, - "text": "embeddingsGenerated: '嵌入向量生成完成'," - }, - { - "line": 297, - "text": "dimensions: '维度'," - }, - { - "line": 298, - "text": "performingHybridSearch: '执行混合搜索...'," - }, - { - "line": 299, - "text": "esSearchCompleted: 'ES搜索完成'," - }, - { - "line": 300, - "text": "resultsCount: '结果数'," - }, - { - "line": 301, - "text": "hybridSearchFailed: '混合搜索失败'," - }, - { - "line": 302, - "text": "getContextForTopicFailed: '获取主题上下文失败'," - }, - { - "line": 303, - "text": "noLLMConfigured: '用户未配置LLM模型'," - }, - { - "line": 304, - "text": "simpleChatGenerationError: '简单聊天生成错误'," - }, - { - "line": 305, - "text": "noMatchInKnowledgeGroup: '所选知识组中未找到相关内容,以下是基于模型的一般性回答:'," - }, - { - "line": 306, - "text": "uploadTextSuccess: '笔记内容已接收。正在后台索引'," - }, - { - "line": 307, - "text": "passwordChanged: '密码已成功修改'," - }, - { - "line": 308, - "text": "userCreated: '用户已成功创建'," - }, - { - "line": 309, - "text": "userInfoUpdated: '用户信息已更新'," - }, - { - "line": 310, - "text": "userDeleted: '用户已删除'," - }, - { - "line": 311, - "text": "pdfNoteTitle: 'PDF 笔记 - {date}'," - }, - { - "line": 312, - "text": "noTextExtracted: '未提取到文本'," - }, - { - "line": 313, - "text": "kbCleared: '知识库已清空'," - }, - { - "line": 314, - "text": "fileDeleted: '文件已删除'," - }, - { - "line": 315, - "text": "pageImageNotFoundDetail: '无法获取 PDF 第 {page} 页’的图像'," - }, - { - "line": 316, - "text": "groupSyncSuccess: '文件分组已更新'," - }, - { - "line": 317, - "text": "fileDeletedFromGroup: '文件已从分组中删除'," - }, - { - "line": 318, - "text": "chunkConfigCorrection: '切片配置已修正: {warnings}'," - }, - { - "line": 319, - "text": "noChunksGenerated: '文件 {id} 未生成任何切片'," - }, - { - "line": 320, - "text": "chunkCountAnomaly: '实际切片数 {actual} 大幅超过预计值 {estimated},可能存在异常'," - }, - { - "line": 321, - "text": "batchSizeExceeded: '批次 {index} 的大小 {actual} 超过推荐值 {limit},将拆分处理'," - }, - { - "line": 322, - "text": "skippingEmptyVectorChunk: '跳过文本块 {index} (空向量)'," - }, - { - "line": 323, - "text": "contextLengthErrorFallback: '批次处理发生上下文长度错误,降级到逐条处理模式'," - }, - { - "line": 324, - "text": "chunkLimitExceededForceBatch: '切片数 {actual} 超过模型批次限制 {limit},强制进行批次处理'," - }, - { - "line": 325, - "text": "noteContentRequired: '笔记内容是必填项'," - }, - { - "line": 326, - "text": "imageAnalysisStarted: '正在使用模型 {id} 分析图像...'," - }, - { - "line": 327, - "text": "batchAnalysisStarted: '正在分析 {count} 张图像...'," - }, - { - "line": 328, - "text": "pageAnalysisFailed: '第 {page} 页分析失败'," - }, - { - "line": 329, - "text": "visionSystemPrompt: '您是专业的文档分析助手。请分析此文档图像,并按以下要求以 JSON 格式返回:\\n\\n1. 提取所有可读文本(按阅读顺序,保持段落和格式)\\n2. 识别图像/图表/表格(描述内容、含义和作用)\\n3. 分析页面布局(仅文本/文本和图像混合/表格/图表等)\\n4. 评估分析质量 (0-1)\\n\\n响应格式:\\n{\\n \"text\": \"完整的文本内容\",\\n \"images\": [\\n {\"type\": \"图表类型\", \"description\": \"详细描述\", \"position\": 1}\\n ],\\n \"layout\": \"布局说明\",\\n \"confidence\": 0.95\\n}'," - }, - { - "line": 330, - "text": "visionModelCall: '[模型调用] 类型: Vision, 模型: {model}, 页面: {page}'," - }, - { - "line": 331, - "text": "visionAnalysisSuccess: '✅ 视觉分析完成: {path}{page}, 文本长度: {textLen}, 图像数: {imgCount}, 布局: {layout}, 置信度: {confidence}%'," - }, - { - "line": 332, - "text": "conversationHistoryNotFound: '对话历史不存在'," - }, - { - "line": 333, - "text": "batchContextLengthErrorFallback: '小文件批次处理发生上下文长度错误,降级到逐条处理模式'," - }, - { - "line": 334, - "text": "chunkProcessingFailed: '处理文本块 {index} 失败,已跳过: {message}'," - }, - { - "line": 335, - "text": "singleTextProcessingComplete: '逐条文本处理完成: {count} 个切片'," - }, - { - "line": 336, - "text": "fileVectorizationComplete: '文件 {id} 向量化完成。共处理 {count} 个文本块。最终内存: {memory}MB'," - }, - { - "line": 337, - "text": "fileVectorizationFailed: '文件 {id} 向量化失败'," - }, - { - "line": 338, - "text": "batchProcessingStarted: '开始批次处理: {count} 个项目'," - }, - { - "line": 339, - "text": "batchProcessingProgress: '正在处理批次 {index}/{total}: {count} 个项目'," - }, - { - "line": 340, - "text": "batchProcessingComplete: '批次处理完成: {count} 个项目,耗时 {duration}s'," - }, - { - "line": 341, - "text": "onlyFailedFilesRetryable: '仅允许重试失败的文件 (当前状态: {status})'," - }, - { - "line": 342, - "text": "emptyFileRetryFailed: '文件内容为空,无法重试。请重新上传文件。'," - }, - { - "line": 343, - "text": "ragSystemPrompt: '您是专业的知识库助手。请根据以下提供的文档内容回答用户的问题。'," - }, - { - "line": 344, - "text": "ragRules: '## 规则:\\n1. 仅根据提供的文档内容进行回答,请勿编造信息。\\n2. 如果文档中没有相关信息,请告知用户。\\n3. 请在回答中注明信息来源。格式:[文件名.扩展子]\\n4. 如果多个文档中的信息存在矛盾,请进行综合分析或解释不同的观点。\\n5. 请使用{lang}进行回答。'," - }, - { - "line": 345, - "text": "ragDocumentContent: '## 文档内容:'," - }, - { - "line": 346, - "text": "ragUserQuestion: '## 用户问题:'," - }, - { - "line": 347, - "text": "ragAnswer: '## 回答:'," - }, - { - "line": 348, - "text": "ragSource: '### 来源:{fileName}'," - }, - { - "line": 349, - "text": "ragSegment: '片段 {index} (相似度: {score}):'," - }, - { - "line": 350, - "text": "ragNoDocumentFound: '未找到相关文档。'," - }, - { - "line": 351, - "text": "queryExpansionPrompt: '您是一个搜索助手。请为以下用户查询生成3个不同的演变版本,以帮助在向量搜索中获得更好的结果。每个版本应包含不同的关键词或表达方式,但保持原始意思。直接输出3行查询,不要有数字或编号:\\n\\n查询:{query}'," - }, - { - "line": 352, - "text": "hydePrompt: '请为以下用户问题写一段简短、事实性的假设回答(约100字)。不要包含任何引导性文字(如“基于我的分析...”),直接输出答案内容。\\n\\n问题:{query}'," - }, - { - "line": 355, - "text": "searching: 'ナレッジベースを検索中...'," - }, - { - "line": 356, - "text": "noResults: '関連する知識が見つかりませんでした。一般的な知識に基づいて回答します...'," - }, - { - "line": 357, - "text": "searchFailed: 'ナレッジベース検索に失敗しました。一般的な知識に基づいて回答します...'," - }, - { - "line": 358, - "text": "generatingResponse: '回答を生成中'," - }, - { - "line": 359, - "text": "files: '個のファイル'," - }, - { - "line": 360, - "text": "notebooks: '個のノートブック'," - }, - { - "line": 361, - "text": "all: 'すべて'," - }, - { - "line": 362, - "text": "items: '件'," - }, - { - "line": 364, - "text": "relevantInfoFound: '件の関連情報が見つかりました'," - }, - { - "line": 365, - "text": "searchHits: '検索ヒット'," - }, - { - "line": 366, - "text": "relevance: '関連度'," - }, - { - "line": 367, - "text": "sourceFiles: '元ファイル'," - }, - { - "line": 368, - "text": "searchScope: '検索範囲'," - }, - { - "line": 369, - "text": "error: 'エラー'," - }, - { - "line": 370, - "text": "creatingHistory: '新規対話履歴を作成: '," - }, - { - "line": 371, - "text": "searchingModelById: 'selectedEmbeddingId に基づいてモデルを検索: '," - }, - { - "line": 372, - "text": "searchModelFallback: '指定された埋め込みモデルが見つかりません。最初に使用可能なモデルを使用します。'," - }, - { - "line": 373, - "text": "noEmbeddingModelFound: '埋め込みモデルの設定が見つかりません'," - }, - { - "line": 374, - "text": "usingEmbeddingModel: '使用する埋め込みModel: '," - }, - { - "line": 375, - "text": "startingSearch: 'ナレッジベースの検索を開始...'," - }, - { - "line": 376, - "text": "searchResultsCount: 'Search results数: '," - }, - { - "line": 377, - "text": "searchFailedLog: '検索失敗'," - }, - { - "line": 378, - "text": "chatStreamError: 'チャットストリームエラー'," - }, - { - "line": 379, - "text": "assistStreamError: 'アシストストリームエラー'," - }, - { - "line": 380, - "text": "file: 'ファイル'," - }, - { - "line": 381, - "text": "content: '内容'," - }, - { - "line": 382, - "text": "userLabel: 'ユーザー'," - }, - { - "line": 383, - "text": "assistantLabel: 'アシスタント'," - }, - { - "line": 384, - "text": "intelligentAssistant: 'あなたはインテリジェントな執筆アシスタントです。'," - }, - { - "line": 385, - "text": "searchString: '検索文字列: '," - }, - { - "line": 386, - "text": "embeddingModelIdNotProvided: 'Embedding model IDが提供されていません'," - }, - { - "line": 387, - "text": "generatingEmbeddings: '埋め込みベクトルを生成中...'," - }, - { - "line": 388, - "text": "embeddingsGenerated: '埋め込みベクトルの生成が完了しました'," - }, - { - "line": 389, - "text": "dimensions: '次元数'," - }, - { - "line": 390, - "text": "performingHybridSearch: 'ES 混合検索を実行中...'," - }, - { - "line": 391, - "text": "esSearchCompleted: 'ES 検索が完了しました'," - }, - { - "line": 392, - "text": "resultsCount: '結果数'," - }, - { - "line": 393, - "text": "hybridSearchFailed: '混合検索に失敗しました'," - }, - { - "line": 394, - "text": "getContextForTopicFailed: 'トピックのコンテキスト取得に失敗しました'," - }, - { - "line": 395, - "text": "noLLMConfigured: 'ユーザーにLLMモデルが設定されていません'," - }, - { - "line": 396, - "text": "simpleChatGenerationError: '簡易チャット生成エラー'," - }, - { - "line": 397, - "text": "noMatchInKnowledgeGroup: '選択された知識グループに関連する内容が見つかりませんでした。以下はモデルに基づく一般的な回答です:'," - }, - { - "line": 398, - "text": "uploadTextSuccess: 'ノート内容を受け取りました。バックグラウンドでインデックス処理を実行中です'," - }, - { - "line": 399, - "text": "passwordChanged: 'パスワードが正常に変更されました'," - }, - { - "line": 400, - "text": "userCreated: 'ユーザーが正常に作成されました'," - }, - { - "line": 401, - "text": "userInfoUpdated: 'ユーザー情報が更新されました'," - }, - { - "line": 402, - "text": "userDeleted: 'ユーザーが削除されました'," - }, - { - "line": 403, - "text": "pdfNoteTitle: 'PDF ノート - {date}'," - }, - { - "line": 404, - "text": "noTextExtracted: 'テキストが抽出されませんでした'," - }, - { - "line": 405, - "text": "kbCleared: 'ナレッジベースが空になりました'," - }, - { - "line": 406, - "text": "fileDeleted: 'ファイルが削除されました'," - }, - { - "line": 407, - "text": "pageImageNotFoundDetail: 'PDF の第 {page} ページの画像を取得できません'," - }, - { - "line": 408, - "text": "groupSyncSuccess: 'ファイルグループが更新されました'," - }, - { - "line": 409, - "text": "fileDeletedFromGroup: 'ファイルがグループから削除されました'," - }, - { - "line": 410, - "text": "chunkConfigCorrection: 'Chunk configurationの修正: {warnings}'," - }, - { - "line": 411, - "text": "noChunksGenerated: 'ファイル {id} からテキストチャンクが生成されませんでした'," - }, - { - "line": 412, - "text": "chunkCountAnomaly: '実際のチャンク数 {actual} が推定値 {estimated} を大幅に超えています。異常がある可能性があります'," - }, - { - "line": 413, - "text": "batchSizeExceeded: 'バッチ {index} のサイズ {actual} が推奨値 {limit} 。分割して処理します'," - }, - { - "line": 414, - "text": "skippingEmptyVectorChunk: '空ベクトルのテキストブロック {index} をスキップします'," - }, - { - "line": 415, - "text": "contextLengthErrorFallback: 'バッチ処理でコンテキスト長エラーが発生しました。単一テキスト処理モードにダウングレードします'," - }, - { - "line": 416, - "text": "chunkLimitExceededForceBatch: 'チャンク数 {actual} がモデルのバッチ制限 {limit} 。強制的にバッチ処理を行います'," - }, - { - "line": 417, - "text": "noteContentRequired: 'ノート内容は必須です'," - }, - { - "line": 418, - "text": "imageAnalysisStarted: 'モデル {id} で画像をAnalyzing...'," - }, - { - "line": 419, - "text": "batchAnalysisStarted: '{count} 枚の画像をAnalyzing...'," - }, - { - "line": 420, - "text": "pageAnalysisFailed: '第 {page} ページの分析に失敗しました'," - }, - { - "line": 421, - "text": "visionSystemPrompt: 'あなたは専門的なドキュメント分析アシスタントです。このドキュメント画像を分析し、以下の要求に従って JSON 形式で返してください:\\n\\n1. すべての読み取り可能なテキストを抽出(読み取り順序に従い、段落と形式を保持)\\n2. 画像/グラフ/表の識別(内容、意味、役割を記述)\\n3. ページレイアウトの分析(テキストのみ/テキストと画像の混合/表/グラフなど)\\n4. 分析品質の評価(0-1)\\n\\nレスポンス形式:\\n{\\n \"text\": \"完全なテキスト内容\",\\n \"images\": [\\n {\"type\": \"グラフの種類\", \"description\": \"詳細な記述\", \"position\": 1}\\n ],\\n \"layout\": \"レイアウトの説明\",\\n \"confidence\": 0.95\\n}'," - }, - { - "line": 422, - "text": "visionModelCall: '[モデル呼び出し] タイプ: Vision, Model: {model}, ページ: {page}'," - }, - { - "line": 423, - "text": "visionAnalysisSuccess: '✅ Vision 分析完了: {path}{page}, テキスト長: {textLen}文字, 画像数: {imgCount}, レイアウト: {layout}, 信頼度: {confidence}%'," - }, - { - "line": 424, - "text": "conversationHistoryNotFound: '会話履歴が存在しません'," - }, - { - "line": 425, - "text": "batchContextLengthErrorFallback: '小ファイルバッチ処理でコンテキスト長エラーが発生しました。単一テキスト処理モードにダウングレードします'," - }, - { - "line": 426, - "text": "chunkProcessingFailed: 'テキストブロック {index} の処理に失敗しました。スキップします: {message}'," - }, - { - "line": 427, - "text": "singleTextProcessingComplete: '単一テキスト処理完了: {count} チャンク'," - }, - { - "line": 428, - "text": "fileVectorizationComplete: 'ファイル {id} ベクトル化完了。{count} 個のテキストブロックを処理しました。最終メモリ: {memory}MB'," - }, - { - "line": 429, - "text": "fileVectorizationFailed: 'ファイル {id} ベクトル化失敗'," - }, - { - "line": 430, - "text": "batchProcessingStarted: 'バッチ処理を開始します: {count} アイテム'," - }, - { - "line": 431, - "text": "batchProcessingProgress: 'バッチ {index}/{total} を処理中: {count} 個のアイテム'," - }, - { - "line": 432, - "text": "batchProcessingComplete: 'バッチ処理完了: {count} アイテム, 所要時間 {duration}s'," - }, - { - "line": 433, - "text": "onlyFailedFilesRetryable: '失敗したファイルのみ再試行可能です (現在のステータス: {status})'," - }, - { - "line": 434, - "text": "emptyFileRetryFailed: 'ファイル内容が空です。再試行できません。ファイルを再アップロードしてください。'," - }, - { - "line": 435, - "text": "ragSystemPrompt: 'あなたは専門的なナレッジベースアシスタントです。以下の提供されたドキュメントの内容に基づいて、ユーザーの質問に答えてください。'," - }, - { - "line": 436, - "text": "ragRules: '## ルール:\\n1. 提供されたドキュメントの内容のみに基づいて回答し、情報を捏造しないでください。\\n2. ドキュメントに関連情報がない場合は、その旨をユーザーに伝えてください。\\n3. 回答には情報源を明記してください。形式:[ファイル名.拡張子]\\n4. 複数のドキュメントで情報が矛盾している場合は、総合的に分析するか、異なる視点を説明してください。\\n5. {lang}で回答してください。'," - }, - { - "line": 437, - "text": "ragDocumentContent: '## ドキュメント内容:'," - }, - { - "line": 438, - "text": "ragUserQuestion: '## ユーザーの質問:'," - }, - { - "line": 439, - "text": "ragAnswer: '## 回答:'," - }, - { - "line": 440, - "text": "ragSource: '### ソース:{fileName}'," - }, - { - "line": 441, - "text": "ragSegment: 'セグメント {index} (類似度: {score}):'," - }, - { - "line": 442, - "text": "ragNoDocumentFound: '関連するドキュメントが見つかりませんでした。'," - }, - { - "line": 443, - "text": "queryExpansionPrompt: 'あなたは検索アシスタントです。以下のユーザーのクエリに対して、ベクトル検索でより良い結果を得るために、3つの異なるバリエーションを生成してください。各バリエーションは異なるキーワードや表現を使用しつつ、元の意味を維持する必要があります。数字やプレフィックスなしで、3行のクエリを直接出力してください:\\n\\nクエリ:{query}'," - }, - { - "line": 444, - "text": "hydePrompt: '以下のユーザーの質問に対して、簡潔で事実に基づいた仮説的な回答(約200文字)を書いてください。「私の分析によると...」などの導入文は含めず、回答内容のみを直接出力してください。\\n\\n質問:{query}'," - } - ], - "d:\\workspace\\AuraK\\server\\src\\knowledge-base\\chunk-config.service.ts": [ - { - "line": 76, - "text": "const providerName = modelConfig.providerName || '不明';" - }, - { - "line": 81, - "text": "` - プロバイダー: ${providerName}\\n` +" - }, - { - "line": 82, - "text": "` - Token制限: ${maxInputTokens}\\n` +" - }, - { - "line": 85, - "text": "` - ベクトルモデルか: ${isVectorModel}`," - }, - { - "line": 294, - "text": "`Chunk size: ${chunkSize} tokens (制限: ${limits.maxInputTokens})`," - }, - { - "line": 295, - "text": "`重なりサイズ: ${chunkOverlap} tokens`," - }, - { - "line": 296, - "text": "`バッチサイズ: ${limits.maxBatchSize}`," - } - ] -} \ No newline at end of file diff --git a/cjk_files.txt b/cjk_files.txt deleted file mode 100644 index 0a738ef..0000000 --- a/cjk_files.txt +++ /dev/null @@ -1,50 +0,0 @@ -d:\workspace\AuraK\web\components\GroupSelector.tsx -d:\workspace\AuraK\web\services\chunkConfigService.ts -d:\workspace\AuraK\web\services\geminiService.ts -d:\workspace\AuraK\web\services\knowledgeGroupService.ts -d:\workspace\AuraK\web\services\pdfPreviewService.ts -d:\workspace\AuraK\web\services\ragService.ts -d:\workspace\AuraK\web\services\searchHistoryService.ts -d:\workspace\AuraK\web\services\uploadService.ts -d:\workspace\AuraK\web\src\utils\toast.ts -d:\workspace\AuraK\web\types.ts -d:\workspace\AuraK\server\src\ai\embedding.service.ts -d:\workspace\AuraK\server\src\api\api.controller.ts -d:\workspace\AuraK\server\src\api\api.service.ts -d:\workspace\AuraK\server\src\chat\chat.controller.ts -d:\workspace\AuraK\server\src\chat\chat.service.ts -d:\workspace\AuraK\server\src\common\constants.ts -d:\workspace\AuraK\server\src\elasticsearch\elasticsearch.service.ts -d:\workspace\AuraK\server\src\i18n\i18n.service.ts -d:\workspace\AuraK\server\src\i18n\messages.ts -d:\workspace\AuraK\server\src\knowledge-base\chunk-config.service.ts -d:\workspace\AuraK\server\src\knowledge-base\embedding.service.ts -d:\workspace\AuraK\server\src\knowledge-base\knowledge-base.controller.ts -d:\workspace\AuraK\server\src\knowledge-base\knowledge-base.entity.ts -d:\workspace\AuraK\server\src\knowledge-base\knowledge-base.service.ts -d:\workspace\AuraK\server\src\knowledge-base\memory-monitor.service.ts -d:\workspace\AuraK\server\src\knowledge-base\text-chunker.service.ts -d:\workspace\AuraK\server\src\libreoffice\libreoffice.interface.ts -d:\workspace\AuraK\server\src\libreoffice\libreoffice.service.ts -d:\workspace\AuraK\server\src\migrations\1737800000000-AddKnowledgeBaseEnhancements.ts -d:\workspace\AuraK\server\src\model-config\dto\create-model-config.dto.ts -d:\workspace\AuraK\server\src\model-config\model-config.entity.ts -d:\workspace\AuraK\server\src\model-config\model-config.service.ts -d:\workspace\AuraK\server\src\pdf2image\pdf2image.interface.ts -d:\workspace\AuraK\server\src\pdf2image\pdf2image.service.ts -d:\workspace\AuraK\server\src\rag\rag.service.ts -d:\workspace\AuraK\server\src\rag\rerank.service.ts -d:\workspace\AuraK\server\src\search-history\search-history.controller.ts -d:\workspace\AuraK\server\src\search-history\search-history.service.ts -d:\workspace\AuraK\server\src\upload\upload.controller.ts -d:\workspace\AuraK\server\src\upload\upload.module.ts -d:\workspace\AuraK\server\src\user\user.controller.ts -d:\workspace\AuraK\server\src\user\user.entity.ts -d:\workspace\AuraK\server\src\user\user.service.ts -d:\workspace\AuraK\server\src\user-setting\user-setting.entity.ts -d:\workspace\AuraK\server\src\user-setting\user-setting.service.ts -d:\workspace\AuraK\server\src\vision\vision.interface.ts -d:\workspace\AuraK\server\src\vision\vision.service.ts -d:\workspace\AuraK\server\src\vision-pipeline\cost-control.service.ts -d:\workspace\AuraK\server\src\vision-pipeline\vision-pipeline-cost-aware.service.ts -d:\workspace\AuraK\server\src\vision-pipeline\vision-pipeline.interface.ts \ No newline at end of file diff --git a/clean_translations.js b/clean_translations.js deleted file mode 100644 index 0ef4140..0000000 --- a/clean_translations.js +++ /dev/null @@ -1,184 +0,0 @@ - -const fs = require('fs'); -const path = require('path'); - -const filePath = process.argv[2]; - -if (!filePath) { - console.error('Please provide a file path'); - process.exit(1); -} - -const content = fs.readFileSync(filePath, 'utf8'); - -// These are missing keys that we want to ensure exist in each language block -const missingKeysData = { - kbSettingsSaved: { zh: "检索与对话配置已保存", en: "Knowledge base settings saved", ja: "設定を保存しました" }, - failedToSaveSettings: { zh: "保存设置失败", en: "Failed to save settings", ja: "設定の保存に失敗しました" }, - actionFailed: { zh: "操作失败", en: "Action failed", ja: "操作に失敗しました" }, - userAddedToOrganization: { zh: "用户已添加到组织", en: "User added to organization", ja: "ユーザーが組織に追加されました" }, - featureUpdated: { zh: "功能已更新", en: "Feature updated", ja: "機能が更新されました" }, - roleTenantAdmin: { zh: "租户管理员", en: "Tenant Administrator", ja: "テナント管理者" }, - roleRegularUser: { zh: "普通用户", en: "Regular User", ja: "一般ユーザー" }, - creatingRegularUser: { zh: "正在创建普通用户", en: "Creating regular user", ja: "一般ユーザーを作成中" }, - editUserRole: { zh: "修改用户角色", en: "Edit user role", ja: "ユーザーロールを編集" }, - targetRole: { zh: "目标角色", en: "Target Role", ja: "対象のロール" }, - editCategory: { zh: "编辑分类", en: "Edit category", ja: "カテゴリを編集" }, - totalTenants: { zh: "总租户数", en: "Total Tenants", ja: "総テナント数" }, - systemUsers: { zh: "系统用户", en: "System Users", ja: "システムユーザー" }, - systemHealth: { zh: "系统健康", en: "System Health", ja: "システムヘルス" }, - operational: { zh: "运行正常", en: "Operational", ja: "正常稼働中" }, - orgManagement: { zh: "组织管理", en: "Organization Management", ja: "組織管理" }, - globalTenantControl: { zh: "全局租户控制", en: "Global Tenant Control", ja: "グローバルテナントコントロール" }, - newTenant: { zh: "新租户", en: "New Tenant", ja: "新規テナント" }, - domainOptional: { zh: "域名 (可选)", en: "Domain (Optional)", ja: "ドメイン (任意)" }, - saveChanges: { zh: "保存修改", en: "Save changes", ja: "変更を保存" }, - modelConfiguration: { zh: "模型配置", en: "Model Configuration", ja: "モデル設定" }, - defaultLLMModel: { zh: "默认推理模型", en: "Default LLM Model", ja: "デフォルト推論モデル" }, - selectLLM: { zh: "选择 LLM", en: "Select LLM", ja: "LLMを選択" }, - selectEmbedding: { zh: "选择 Embedding", en: "Select Embedding", ja: "埋め込みを選択" }, - rerankModel: { zh: "Rerank 模型", en: "Rerank Model", ja: "リランクモデル" }, - none: { zh: "无", en: "None", ja: "なし" }, - indexingChunkingConfig: { zh: "索引与切片配置", en: "Indexing & Chunking Config", ja: "インデックスとチャンク設定" }, - chatHyperparameters: { zh: "聊天超参数", en: "Chat Hyperparameters", ja: "チャットハイパーパラメータ" }, - temperature: { zh: "随机性 (Temperature)", en: "Temperature", ja: "温度" }, - precise: { zh: "精确", en: "Precise", ja: "精密" }, - creative: { zh: "创意", en: "Creative", ja: "クリエイティブ" }, - maxResponseTokens: { zh: "最大响应标识 (Max Tokens)", en: "Max Response Tokens", ja: "最大応答トークン数" }, - retrievalSearchSettings: { zh: "检索与搜索设置", en: "Retrieval & Search Settings", ja: "検索設定" }, - topK: { zh: "召回数量 (Top K)", en: "Top K", ja: "Top K" }, - similarityThreshold: { zh: "相似度阈值", en: "Similarity Threshold", ja: "類似度しきい値" }, - enableHybridSearch: { zh: "启用混合检索", en: "Enable Hybrid Search", ja: "ハイブリッド検索を有効にする" }, - hybridSearchDesc: { zh: "同时使用向量和全文检索以提高召回率", en: "Use both vector and full-text search to improve recall", ja: "ベクトル検索と全文検索を併用して検索精度を向上させます" }, - hybridWeight: { zh: "混合权重 (0.0=全文, 1.0=向量)", en: "Hybrid Weight (0.0=Fulltext, 1.0=Vector)", ja: "ハイブリッド重み (0.0=全文, 1.0=ベクトル)" }, - pureText: { zh: "纯文本", en: "Pure Text", ja: "純粋なテキスト" }, - pureVector: { zh: "纯向量", en: "Pure Vector", ja: "純粋なベクトル" }, - enableQueryExpansion: { zh: "启用查询扩展", en: "Enable Query Expansion", ja: "クエリ拡張を有効にする" }, - queryExpansionDesc: { zh: "生成多个查询变体以提高覆盖率", en: "Generate multiple query variations for better coverage", ja: "複数のクエリバリアントを生成してカバレッジを向上させます" }, - enableHyDE: { zh: "启用 HyDE", en: "Enable HyDE", ja: "HyDEを有効にする" }, - hydeDesc: { zh: "生成假设回答以改善语义搜索", en: "Generate hypothetical answers to improve semantic search", ja: "仮想的な回答を生成してセマンティック検索を改善します" }, - enableReranking: { zh: "启用重排序 (Rerank)", en: "Enable Reranking", ja: "リランクを有効にする" }, - rerankingDesc: { zh: "使用 Rerank 模型对结果进行二次排序", en: "Use Rerank model to re-sort results", ja: "リランクモデルを使用して結果を再ソートします" }, - broad: { zh: "宽泛", en: "Broad", ja: "広範" }, - strict: { zh: "严格", en: "Strict", ja: "厳格" }, - maxInput: { zh: "最大输入", en: "Max Input", ja: "最大入力" }, - dimensions: { zh: "维度", en: "Dimensions", ja: "次元" }, - defaultBadge: { zh: "默认", en: "Default", ja: "デフォルト" }, - dims: { zh: "维度: $1", en: "Dims: $1", ja: "次元: $1" }, - ctx: { zh: "上下文: $1", en: "Ctx: $1", ja: "コンテキスト: $1" }, - baseApi: { zh: "Base API: $1", en: "Base API: $1", ja: "Base API: $1" }, - configured: { zh: "已配置", en: "Configured", ja: "設定済み" }, - groupUpdated: { zh: "分组已更新", en: "Group updated", ja: "グループが更新されました" }, - groupDeleted: { zh: "分组已删除", en: "Group deleted", ja: "グループが削除されました" }, - groupCreated: { zh: "分组已创建", en: "Group created", ja: "グループが作成されました" }, - navCatalog: { zh: "目录", en: "Catalog", ja: "カタログ" }, - allDocuments: { zh: "所有文档", en: "All Documents", ja: "すべてのドキュメント" }, - categories: { zh: "分类", en: "Categories", ja: "カテゴリ" }, - uncategorizedFiles: { zh: "未分类文件", en: "Uncategorized Files", ja: "未分類ファイル" }, - category: { zh: "分类", en: "Category", ja: "カテゴリ" }, - statusReadyDesc: { zh: "已索引可查询", en: "Indexed and searchable", ja: "インデックス済みで検索可能" }, - statusIndexingDesc: { zh: "正在建立词向量索引", en: "Building vector index", ja: "ベクトルインデックスを作成中" }, - selectCategory: { zh: "选择分类", en: "Select Category", ja: "カテゴリを選択" }, - noneUncategorized: { zh: "无未分类文件", en: "No uncategorized files", ja: "未分類ファイルなし" }, - previous: { zh: "上一页", en: "Previous", ja: "前へ" }, - next: { zh: "下一页", en: "Next", ja: "次へ" }, - createCategory: { zh: "创建分类", en: "Create Category", ja: "カテゴリを作成" }, - categoryDesc: { zh: "描述您的知识分类", en: "Describe your knowledge category", ja: "ナレッジカテゴリを説明します" }, - categoryName: { zh: "分类名称", en: "Category Name", ja: "カテゴリ名" }, - createCategoryBtn: { zh: "立即创建", en: "Create Now", ja: "今すぐ作成" }, - newGroup: { zh: "新建分组", en: "New Group", ja: "新規グループ" }, - noKnowledgeGroups: { zh: "暂无知识库分组", en: "No knowledge groups yet", ja: "ナレッジグループがまだありません" }, - createGroupDesc: { zh: "开始创建您的第一个知识库分组并上传相关文档。", en: "Start by creating your first knowledge group and uploading documents.", ja: "最初のナレッジグループを作成してドキュメントをアップロードしてください。" }, - noDescriptionProvided: { zh: "未提供描述", en: "No description provided", ja: "説明なし" }, - browseManageFiles: { zh: "浏览并管理该分组下的文件和笔记。", en: "Browse and manage files and notes in this group.", ja: "このグループ内のファイルとメモを閲覧・管理します。" }, - filterGroupFiles: { zh: "根据名称搜索分组内文件...", en: "Search files in group by name...", ja: "名前でグループ内のファイルを検索..." }, - generalSettingsSubtitle: { zh: "管理您的应用程序首选项。", en: "Manage your application preferences.", ja: "アプリケーションの設定を管理します。" }, - userManagementSubtitle: { zh: "管理访问权限和帐户。", en: "Manage access and accounts.", ja: "アクセス権限とアカウントを管理します。" }, - modelManagementSubtitle: { zh: "配置全局 AI 模型。", en: "Configure global AI models.", ja: "グローバルなAIモデルを設定します。" }, - kbSettingsSubtitle: { zh: "索引和聊天参数的技术配置。", en: "Technical configuration for indexing and chat parameters.", ja: "インデックス作成とチャットパラメータの技術設定。" }, - tenantsSubtitle: { zh: "全局系统概览。", en: "Global system overview.", ja: "グローバルシステムの概要。" }, - allNotes: { zh: "所有笔记", en: "All Notes", ja: "すべてのノート" }, - filterNotesPlaceholder: { zh: "筛选笔记...", en: "Filter notes...", ja: "ノートをフィルタリング..." }, - noteTitlePlaceholder: { zh: "标题...", en: "Title...", ja: "タイトル..." }, - startWritingPlaceholder: { zh: "开始写作...", en: "Start writing...", ja: "書き始める..." }, - previewHeader: { zh: "预览", en: "Preview", ja: "プレビュー" }, - noContentToPreview: { zh: "没有可预览的内容", en: "No content to preview", ja: "プレビューするコンテンツがありません" }, - hidePreview: { zh: "隐藏预览", en: "Hide Preview", ja: "プレビューを非表示" }, - showPreview: { zh: "显示预览", en: "Show Preview", ja: "プレビューを表示" }, - directoryLabel: { zh: "目录", en: "Directory", ja: "ディレクトリ" }, - uncategorized: { zh: "未分类", en: "Uncategorized", ja: "未分類" }, - enterNamePlaceholder: { zh: "输入名称...", en: "Enter name...", ja: "名前を入力..." }, - subFolderPlaceholder: { zh: "子文件夹...", en: "Sub-folder...", ja: "サブフォルダ..." }, - categoryCreated: { zh: "分类已创建", en: "Category created", ja: "カテゴリが作成されました" }, - failedToCreateCategory: { zh: "创建分类失败", en: "Failed to create category", ja: "カテゴリの作成に失敗しました" }, - failedToDeleteCategory: { zh: "删除分类失败", en: "Failed to delete category", ja: "カテゴリの削除に失敗しました" }, - confirmDeleteCategory: { zh: "您确定要删除此分类吗?", en: "Are you sure you want to delete this category?", ja: "このカテゴリを削除してもよろしいですか?" } -}; - -const lines = content.split('\n'); -let currentLang = null; -let resultLines = []; -let keysSeen = new Set(); - -const langStartRegex = /^\s+(\w+): \{/; -const keyRegex = /^\s+([a-zA-Z0-9_-]+):/; - -for (let i = 0; i < lines.length; i++) { - const line = lines[i]; - - const langMatch = line.match(langStartRegex); - if (langMatch) { - // If we were in a language block, append missing keys before finishing it - if (currentLang) { - addMissingKeys(currentLang, resultLines, keysSeen); - } - currentLang = langMatch[1]; - keysSeen = new Set(); - resultLines.push(line); - continue; - } - - if (currentLang) { - const keyMatch = line.match(keyRegex); - if (keyMatch) { - const key = keyMatch[1]; - if (keysSeen.has(key)) { - // Duplicate key, skip it - continue; - } - keysSeen.add(key); - } - - // If the line ends the block - if (line.trim() === '},') { - addMissingKeys(currentLang, resultLines, keysSeen); - currentLang = null; - resultLines.push(line); - continue; - } - - // Also handle the very last block which might not have a comma - if (line.trim() === '}' && i > lines.length - 5) { - addMissingKeys(currentLang, resultLines, keysSeen); - currentLang = null; - resultLines.push(line); - continue; - } - } - - resultLines.push(line); -} - -function addMissingKeys(lang, targetLines, seen) { - for (const [key, translations] of Object.entries(missingKeysData)) { - if (!seen.has(key)) { - const val = translations[lang] || translations['en'] || key; - const escapedVal = JSON.stringify(val); - targetLines.push(` ${key}: ${escapedVal},`); - seen.add(key); - } - } -} - -fs.writeFileSync(filePath, resultLines.join('\n'), 'utf8'); -console.log('Translations file cleaned and updated successfully!'); diff --git a/clean_translations.py b/clean_translations.py deleted file mode 100644 index cc9b9c7..0000000 --- a/clean_translations.py +++ /dev/null @@ -1,87 +0,0 @@ - -import sys -import re - -def clean_translations(file_path): - with open(file_path, 'r', encoding='utf-8') as f: - content = f.read() - - # Split into blocks - blocks = re.split(r'(\s+\w+: \{)', content) - # Header is blocks[0] - # Then blocks[1] is " zh: {", blocks[2] is content of zh - # blocks[3] is " en: {", blocks[4] is content of en - # blocks[5] is " ja: {", blocks[6] is content of ja - - header = blocks[0] - processed_blocks = [] - - # Missing keys to ensure (with basic English values) - missing_keys = [ - "kbSettingsSaved", "failedToSaveSettings", "actionFailed", "userAddedToOrganization", - "featureUpdated", "roleTenantAdmin", "roleRegularUser", "creatingRegularUser", - "editUserRole", "targetRole", "editCategory", "totalTenants", "systemUsers", - "systemHealth", "operational", "orgManagement", "globalTenantControl", - "newTenant", "domainOptional", "saveChanges", "modelConfiguration", - "defaultLLMModel", "selectLLM", "selectEmbedding", "rerankModel", "none", - "indexingChunkingConfig", "chatHyperparameters", "temperature", "precise", - "creative", "maxResponseTokens", "retrievalSearchSettings", "topK", - "similarityThreshold", "enableHybridSearch", "hybridSearchDesc", "hybridWeight", - "pureText", "pureVector", "enableQueryExpansion", "queryExpansionDesc", - "enableHyDE", "hydeDesc", "enableReranking", "rerankingDesc", "broad", - "strict", "maxInput", "dimensions", "defaultBadge", "dims", "ctx", - "baseApi", "configured", "groupUpdated", "groupDeleted", "groupCreated", - "navCatalog", "allDocuments", "categories", "uncategorizedFiles", "category", - "statusReadyDesc", "statusIndexingDesc", "selectCategory", "noneUncategorized", - "previous", "next", "createCategory", "categoryDesc", "categoryName", - "createCategoryBtn", "newGroup", "noKnowledgeGroups", "createGroupDesc", - "noDescriptionProvided", "browseManageFiles", "filterGroupFiles" - ] - - for i in range(1, len(blocks), 2): - block_header = blocks[i] - block_content = blocks[i+1] - - # Parse keys and values - lines = block_content.split('\n') - keys_seen = set() - new_lines = [] - - # Regex to match "key: value," or "key: `value`," - # Support multiline strings too? Let's be careful. - # Most are single line: " key: \"value\"," - - for line in lines: - match = re.search(r'^\s+([a-zA-Z0-9_-]+):', line) - if match: - key = match.group(1) - if key in keys_seen: - continue # Skip duplicate - keys_seen.add(key) - new_lines.append(line) - - # Add missing keys if they are not in keys_seen - # Remove trailing " }," or "}," to append - if new_lines and re.search(r'^\s+},?$', new_lines[-1]): - last_line = new_lines.pop() - elif new_lines and re.search(r'^\s+},?$', new_lines[-2]): # Check if last is empty - last_line = new_lines.pop(-2) - else: - last_line = " }," - - for key in missing_keys: - if key not in keys_seen: - # Add a descriptive placeholder or common translation - val = f'"{key}"' # Default to key name - new_lines.append(f' {key}: {val},') - - new_lines.append(last_line) - processed_blocks.append(block_header + '\n'.join(new_lines)) - - new_content = header + ''.join(processed_blocks) - - with open(file_path, 'w', encoding='utf-8') as f: - f.write(new_content) - -if __name__ == "__main__": - clean_translations(sys.argv[1]) diff --git a/deploy.sh b/deploy.sh deleted file mode 100644 index 255a453..0000000 --- a/deploy.sh +++ /dev/null @@ -1,43 +0,0 @@ -#!/bin/bash -set -e - -# 进入脚本所在目录(确保和 docker-compose.yml 在同一目录) -cd "$(dirname "$0")" - -echo "=======================================================" -echo "开始在服务器上拉取镜像并一键部署" -echo "=======================================================" - -echo ">> 正在从阿里云镜像库拉取最新的 server 和 web 镜像..." -# 如果拉取需要密码,请确保服务器上已经执行过 docker login -if ! docker pull registry.cn-qingdao.aliyuncs.com/fzxs/aurak-server:latest; then - echo "拉取 server 镜像失败!请确保服务器已登录 registry.cn-qingdao.aliyuncs.com" - exit 1 -fi - -if ! docker pull registry.cn-qingdao.aliyuncs.com/fzxs/aurak-web:latest; then - echo "拉取 web 镜像失败!请确保服务器已登录 registry.cn-qingdao.aliyuncs.com" - exit 1 -fi - -echo ">> 为了让 docker-compose 能直接使用拉取的镜像,重新标记(Tag)镜像..." -docker tag registry.cn-qingdao.aliyuncs.com/fzxs/aurak-server:latest aurak-server:latest 2>/dev/null || true -docker tag registry.cn-qingdao.aliyuncs.com/fzxs/aurak-web:latest aurak-web:latest 2>/dev/null || true - -# 因为 docker-compose 没有指定 image,会默认通过文件夹名字或我们指定的标签运行 -# 如果 docker-compose 仍然会去找默认名字,我们需要让环境变量里的 image 为我们拉取的, -# 不过最简单的方式是,通过环境变量临时覆盖,或者使用 docker compose up 的特性 -# 但既然不能改 docker-compose.yml,我们可以通过 IMAGE_NAME 环境变量来覆盖吗?没有设定的话不行。 -# 所以我们可以通过 docker tag 来把阿里云的镜像打成 docker-compose.yml 默认预期的服务名字 -# 如果目录叫 AuraK,docker-compose 默认生成的镜像名叫 aurak-server 和 aurak-web -docker tag registry.cn-qingdao.aliyuncs.com/fzxs/aurak-server:latest aurak-server 2>/dev/null || true -docker tag registry.cn-qingdao.aliyuncs.com/fzxs/aurak-web:latest aurak-web 2>/dev/null || true - -echo ">> 正在重新创建并启动容器..." -# --no-build 确保在服务器上不会意外使用本地代码触发构建 -docker compose up -d --no-build server web - -echo "=======================================================" -echo "部署完成!当前服务运行状态:" -docker compose ps -echo "=======================================================" diff --git a/extract_cjk.js b/extract_cjk.js deleted file mode 100644 index 462c277..0000000 --- a/extract_cjk.js +++ /dev/null @@ -1,45 +0,0 @@ -const fs = require('fs'); -const path = require('path'); - -const directories = ['d:/workspace/AuraK/web', 'd:/workspace/AuraK/server/src']; -const excludeDirs = ['node_modules', '.git', 'dist', '.next', 'dist-check']; -const extensions = ['.ts', '.tsx', '.js', '.jsx']; - -const cjkPattern = /[\u4e00-\u9fff\u3040-\u309f\u30a0-\u30ff]+/; -const cjkLines = {}; - -function walkSync(currentDirPath, callback) { - fs.readdirSync(currentDirPath).forEach((name) => { - const filePath = path.join(currentDirPath, name); - const stat = fs.statSync(filePath); - if (stat.isFile()) { - callback(filePath, stat); - } else if (stat.isDirectory() && !excludeDirs.includes(name)) { - walkSync(filePath, callback); - } - }); -} - -directories.forEach(d => { - walkSync(d, (filePath) => { - if (extensions.some(ext => filePath.endsWith(ext))) { - try { - const content = fs.readFileSync(filePath, 'utf-8'); - const lines = content.split('\n'); - lines.forEach((line, i) => { - if (cjkPattern.test(line)) { - if (!cjkLines[filePath]) { - cjkLines[filePath] = []; - } - cjkLines[filePath].push({ line: i + 1, text: line.trim() }); - } - }); - } catch (e) { - console.error(`Error reading ${filePath}: `, e); - } - } - }); -}); - -fs.writeFileSync('cjk_extract.json', JSON.stringify(cjkLines, null, 2), 'utf-8'); -console.log('Extracted to cjk_extract.json'); diff --git a/extract_cjk.py b/extract_cjk.py deleted file mode 100644 index 3a6f173..0000000 --- a/extract_cjk.py +++ /dev/null @@ -1,31 +0,0 @@ -import os -import re -import json - -directories = ['d:/workspace/AuraK/web', 'd:/workspace/AuraK/server/src'] -exclude_dirs = ['node_modules', '.git', 'dist', '.next'] -extensions = ['.ts', '.tsx', '.js', '.jsx'] - -cjk_pattern = re.compile(r'[\u4e00-\u9fff\u3040-\u309f\u30a0-\u30ff]+') - -cjk_lines = {} -for d in directories: - for root, dirs, files in os.walk(d): - dirs[:] = [dir for dir in dirs if dir not in exclude_dirs] - for file in files: - if any(file.endswith(ext) for ext in extensions): - file_path = os.path.join(root, file) - try: - with open(file_path, 'r', encoding='utf-8') as f: - lines = f.readlines() - for i, line in enumerate(lines): - if cjk_pattern.search(line): - if file_path not in cjk_lines: - cjk_lines[file_path] = [] - cjk_lines[file_path].append({"line": i + 1, "text": line.strip()}) - except Exception as e: - print(f"Error reading {file_path}: {e}") - -with open('cjk_extract.json', 'w', encoding='utf-8') as f: - json.dump(cjk_lines, f, ensure_ascii=False, indent=2) -print("Extracted to cjk_extract.json") diff --git a/extract_keys.js b/extract_keys.js deleted file mode 100644 index 90831c4..0000000 --- a/extract_keys.js +++ /dev/null @@ -1,37 +0,0 @@ - -const fs = require('fs'); -const path = require('path'); - -function getFiles(dir, fileList = []) { - const files = fs.readdirSync(dir); - for (const file of files) { - const name = path.join(dir, file); - if (fs.statSync(name).isDirectory()) { - if (file !== 'node_modules' && file !== '.git' && file !== 'dist') { - getFiles(name, fileList); - } - } else { - if (name.endsWith('.tsx') || name.endsWith('.ts')) { - fileList.push(name); - } - } - } - return fileList; -} - -const webDir = path.join('d:', 'workspace', 'AuraK', 'web'); -const files = getFiles(webDir); -const keys = new Set(); -const tRegex = /t\(\s*['"]([a-zA-Z0-9_-]+)['"]/g; - -for (const file of files) { - const content = fs.readFileSync(file, 'utf8'); - let match; - while ((match = tRegex.exec(content)) !== null) { - keys.add(match[1]); - } -} - -const sortedKeys = Array.from(keys).sort(); -fs.writeFileSync(path.join('d:', 'workspace', 'AuraK', 'all_used_keys.txt'), sortedKeys.join('\n')); -console.log(`Extracted ${sortedKeys.length} unique keys to all_used_keys.txt`); diff --git a/extract_logs.js b/extract_logs.js deleted file mode 100644 index a673c57..0000000 --- a/extract_logs.js +++ /dev/null @@ -1,37 +0,0 @@ -const fs = require('fs'); -const path = require('path'); - -function walkDir(dir, callback) { - fs.readdirSync(dir).forEach(f => { - let dirPath = path.join(dir, f); - let isDirectory = fs.statSync(dirPath).isDirectory(); - if (isDirectory) { - if (f !== 'node_modules' && f !== '.git' && f !== 'dist' && f !== '.next' && f !== 'build' && f !== 'coverage') { - walkDir(dirPath, callback); - } - } else { - if (dirPath.endsWith('.ts') || dirPath.endsWith('.tsx') || dirPath.endsWith('.js')) { - callback(path.join(dir, f)); - } - } - }); -} - -const filesWithLogs = []; -const logRegex = /(console|logger|Logger)\.(log|error|warn|info|debug|verbose)\(([^)]*[\u4e00-\u9fa5]+[^)]*)\)/g; - -walkDir('d:/workspace/AuraK/server', (filePath) => { - const content = fs.readFileSync(filePath, 'utf8'); - if (logRegex.test(content)) { - filesWithLogs.push(filePath); - } -}); -walkDir('d:/workspace/AuraK/web', (filePath) => { - const content = fs.readFileSync(filePath, 'utf8'); - if (logRegex.test(content)) { - filesWithLogs.push(filePath); - } -}); - -console.log('Found ' + filesWithLogs.length + ' files'); -fs.writeFileSync('d:/workspace/AuraK/files_to_translate.json', JSON.stringify(filesWithLogs, null, 2)); diff --git a/extract_strings.js b/extract_strings.js deleted file mode 100644 index 6c03051..0000000 --- a/extract_strings.js +++ /dev/null @@ -1,29 +0,0 @@ -const fs = require('fs'); - -const files = require('./files_to_translate.json'); -const translationMap = {}; - -const logRegex = /(?:console|logger|Logger|this\.logger)\.(?:log|error|warn|info|debug|verbose)\(\s*((?:[\'\"\`])(?:.*?)[\u4e00-\u9fa5]+(?:.*?)(?:[\'\"\`]))/g; -// We also need to catch template literals that have variables, e.g. `User ${userId} created` -const logRegexTemplate = /(?:console|logger|Logger|this\.logger)\.(?:log|error|warn|info|debug|verbose)\(\s*(\`(?:.*?)\`)/gs; - -files.forEach(file => { - const content = fs.readFileSync(file, 'utf8'); - let match; - // Match single/double quotes with Chinese - const simpleStringRegex = /(?:console|logger|Logger|this\.logger)\.(?:log|error|warn|info|debug|verbose)\(\s*(['"])(.*?[\u4e00-\u9fa5]+.*?)\1/g; - while ((match = simpleStringRegex.exec(content)) !== null) { - translationMap[match[2]] = ""; // The inner string - } - - // Match template literals with Chinese - const templateRegex = /(?:console|logger|Logger|this\.logger)\.(?:log|error|warn|info|debug|verbose)\(\s*\`([\s\S]*?)\`/g; - while ((match = templateRegex.exec(content)) !== null) { - if (/[\u4e00-\u9fa5]/.test(match[1])) { - translationMap[match[1]] = ""; - } - } -}); - -fs.writeFileSync('translation_map.json', JSON.stringify(translationMap, null, 2)); -console.log('Extracted ' + Object.keys(translationMap).length + ' distinct strings.'); diff --git a/files_to_translate.json b/files_to_translate.json deleted file mode 100644 index a72d0a8..0000000 --- a/files_to_translate.json +++ /dev/null @@ -1,4 +0,0 @@ -[ - "d:\\workspace\\AuraK\\server\\src\\knowledge-base\\embedding.service.ts", - "d:\\workspace\\AuraK\\server\\src\\vision\\vision.service.ts" -] \ No newline at end of file diff --git a/final_cleanup.js b/final_cleanup.js deleted file mode 100644 index a689824..0000000 --- a/final_cleanup.js +++ /dev/null @@ -1,89 +0,0 @@ - -const fs = require('fs'); -const path = require('path'); - -const translationsPath = path.join('d:', 'workspace', 'AuraK', 'web', 'utils', 'translations.ts'); - -const betterTranslations = { - navAgent: { zh: "智能体", en: "Agent", ja: "エージェント" }, - navNotebook: { zh: "笔记本", en: "Notebook", ja: "ノートブック" }, - navPlugin: { zh: "插件", en: "Plugins", ja: "プラグイン" }, - navTenants: { zh: "租户管理", en: "Tenants", ja: "テナント管理" }, - noNotesFound: { zh: "未找到笔记", en: "No notes found", ja: "ノートが見つかりません" }, - notebookDesc: { zh: "笔记本功能可以帮助您整理和归纳知识。", en: "Notebooks help you organize and summarize knowledge.", ja: "ノートブックは知識の整理と要約に役立ちます。" }, - personalNotebook: { zh: "个人笔记本", en: "Personal Notebook", ja: "個人用ノートブック" }, - pluginBy: { zh: "作者", en: "By", ja: "作者" }, - pluginCommunity: { zh: "社区插件", en: "Community Plugins", ja: "コミュニティプラグイン" }, - pluginConfig: { zh: "插件配置", en: "Plugin Config", ja: "プラグイン設定" }, - pluginDesc: { zh: "扩展系统功能。", en: "Extend system capabilities.", ja: "システム機能を拡張します。" }, - pluginOfficial: { zh: "官方插件", en: "Official Plugins", ja: "公式プラグイン" }, - pluginTitle: { zh: "插件", en: "Plugins", ja: "プラグイン" }, - searchAgent: { zh: "搜索智能体", en: "Search Agents", ja: "エージェントを検索" }, - searchPlugin: { zh: "搜索插件", en: "Search Plugins", ja: "プラグインを検索" }, - statusRunning: { zh: "运行中", en: "Running", ja: "実行中" }, - statusStopped: { zh: "已停止", en: "Stopped", ja: "停止中" }, - success: { zh: "成功", en: "Success", ja: "成功" }, - updatedAtPrefix: { zh: "最后更新于", en: "Last updated at", ja: "最終更新日:" }, - visualVision: { zh: "视觉分析", en: "Visual Analysis", ja: "視覚分析" }, - warning: { zh: "警告", en: "Warning", ja: "警告" }, - "x-api-key": { zh: "API 密钥", en: "API Key", ja: "APIキー" }, - "x-tenant-id": { zh: "租户 ID", en: "Tenant ID", ja: "テナントID" }, - "x-user-language": { zh: "用户语言", en: "User Language", ja: "ユーザー言語" }, - unknown: { zh: "未知", en: "Unknown", ja: "不明" } -}; - -let content = fs.readFileSync(translationsPath, 'utf8'); - -function isValidIdentifier(id) { - return /^[a-zA-Z_$][a-zA-Z0-9_$]*$/.test(id); -} - -// Simple parser to extract blocks -const langBlocks = content.split(/(\w+): \{/); -let header = langBlocks[0]; -let newContent = header; - -for (let i = 1; i < langBlocks.length; i += 2) { - const lang = langBlocks[i]; - let block = langBlocks[i + 1]; - - // Find the end of this block - let endIdx = block.lastIndexOf('},'); - if (endIdx === -1) endIdx = block.lastIndexOf('}'); // last block - - let footer = block.substring(endIdx); - let itemsStr = block.substring(0, endIdx); - - let items = itemsStr.split('\n'); - let seenKeys = new Set(); - let resultItems = []; - - for (let line of items) { - let match = line.match(/^(\s+)(['"]?[a-zA-Z0-9_-]+['"]?):(.*)/); - if (match) { - let indent = match[1]; - let keyStr = match[2]; - let rest = match[3]; - - let actualKey = keyStr.replace(/['"]/g, ''); - if (seenKeys.has(actualKey)) continue; - seenKeys.add(actualKey); - - let val = rest.trim().replace(/,$/, ''); - // If it's a placeholder (same as key) or empty, use better translation if available - if ((val === `"${actualKey}"` || val === `'${actualKey}'`) && betterTranslations[actualKey]) { - val = JSON.stringify(betterTranslations[actualKey][lang] || betterTranslations[actualKey].en || actualKey); - } - - const quotedKey = isValidIdentifier(actualKey) ? actualKey : `"${actualKey}"`; - resultItems.push(`${indent}${quotedKey}: ${val},`); - } else if (line.trim().startsWith('//') || line.trim() === '') { - resultItems.push(line); - } - } - - newContent += `${lang}: {` + resultItems.join('\n') + footer; -} - -fs.writeFileSync(translationsPath, newContent, 'utf8'); -console.log('Final cleanup and translation improvement complete!'); diff --git a/final_fix_braces.js b/final_fix_braces.js deleted file mode 100644 index 0dda3bf..0000000 --- a/final_fix_braces.js +++ /dev/null @@ -1,26 +0,0 @@ - -const fs = require('fs'); -const path = require('path'); - -const translationsPath = path.join('d:', 'workspace', 'AuraK', 'web', 'utils', 'translations.ts'); -let content = fs.readFileSync(translationsPath, 'utf8'); - -// The file should end with ja object closing and then main object closing. -// Current last line: }; // end of translations -// We want: -// }, -// }; - -// Strip potential trailing whitespace or comments that might mess up endsWith -const lines = content.trimEnd().split('\n'); -const lastLine = lines[lines.length - 1]; - -if (lastLine.includes('};')) { - console.log('Found closing brace at the end. Fixing...'); - lines[lines.length - 1] = ' },'; - lines.push('};'); - fs.writeFileSync(translationsPath, lines.join('\n') + '\n', 'utf8'); - console.log('Fixed end of file.'); -} else { - console.log('Closing brace not found as expected. Last line:', lastLine); -} diff --git a/fix_empty_translations.js b/fix_empty_translations.js deleted file mode 100644 index c5cde8f..0000000 --- a/fix_empty_translations.js +++ /dev/null @@ -1,21 +0,0 @@ - -const fs = require('fs'); -const path = require('path'); - -const translationsPath = path.join('d:', 'workspace', 'AuraK', 'web', 'utils', 'translations.ts'); -let content = fs.readFileSync(translationsPath, 'utf8'); - -// Fix the specific syntax error first: key: , -> key: "key", -const lines = content.split('\n'); -const fixedLines = lines.map(line => { - const match = line.match(/^(\s+)(["']?[a-zA-Z0-9_-]+["']?):\s*,/); - if (match) { - const indent = match[1]; - const key = match[2].replace(/['"]/g, ''); - return `${indent}${match[2]}: "${key}",`; - } - return line; -}); - -fs.writeFileSync(translationsPath, fixedLines.join('\n'), 'utf8'); -console.log('Fixed empty values in translations.ts!'); diff --git a/fix_kb_service.py b/fix_kb_service.py deleted file mode 100644 index 2faf1ee..0000000 --- a/fix_kb_service.py +++ /dev/null @@ -1,74 +0,0 @@ -import os - -file_path = r'd:\aura\AuraK\server\src\knowledge-base\knowledge-base.service.ts' - -with open(file_path, 'r', encoding='utf-8') as f: - lines = f.readlines() - -new_lines = [] -changed = False -for line in lines: - # Match the specific pattern: userId, followed by kb.embeddingModelId - if 'userId,' in line and 'kb.embeddingModelId' in line: - # Check if it's the specific call site with three arguments - # Example: [chunk.content], userId, kb.embeddingModelId - # Or: batchTexts, userId, kb.embeddingModelId - if 'getEmbeddings' not in line: # It's probably a multi-line call - pass# Handled below - - new_line = line.replace('userId,', '').replace(' ', ' ') # Simple fix for potential double spaces - # But wait, let's be more precise - if 'userId,' in line: - new_line = line.replace('userId,', '').strip() - # Re-add leading whitespace - leading = line[:line.find(line.lstrip())] - new_line = leading + new_line + '\n' - new_lines.append(new_line) - changed = True - continue - - new_lines.append(line) - -# Let's try a simpler approach if the above is too complex -with open(file_path, 'r', encoding='utf-8') as f: - content = f.read() - -# Pattern 1: [chunk.content], userId, kb.embeddingModelId -target1 = """ [chunk.content], // Single text - userId, - kb.embeddingModelId,""" -replacement1 = """ [chunk.content], // Single text - kb.embeddingModelId,""" - -# Pattern 2: chunkTexts, userId, kb.embeddingModelId -target2 = """ chunkTexts, - userId, - kb.embeddingModelId,""" -replacement2 = """ chunkTexts, - kb.embeddingModelId,""" - -# Pattern 3: batchTexts, userId, kb.embeddingModelId -target3 = """ batchTexts, - userId, - kb.embeddingModelId,""" -replacement3 = """ batchTexts, - kb.embeddingModelId,""" - -# Pattern 4 (Precise results): texts, userId, embeddingModelId -target4 = """ texts, - userId, - embeddingModelId,""" -replacement4 = """ texts, - embeddingModelId,""" - -fixed_content = content.replace(target1, replacement1) -fixed_content = fixed_content.replace(target2, replacement2) -fixed_content = fixed_content.replace(target3, replacement3) -fixed_content = fixed_content.replace(target4, replacement4) - -if fixed_content != content: - with open(file_path, 'w', encoding='utf-8') as f: - f.write(fixed_content) - print("Successfully replaced patterns.") -else: - print("No patterns found to replace.") diff --git a/identifier.sqlite b/identifier.sqlite deleted file mode 100644 index e69de29..0000000 diff --git a/lint_output.txt b/lint_output.txt deleted file mode 100644 index cedab1fd5129411c818ac7d6da1b13d8d4530a13..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1510 zcmb7^PjAye5XI+=#CNcQR22b%ULzrj(pExH{uQZ*7D1Xgu8HGBwo8eS+AE(L_`O-X zu^>J~tF_m=GjHC!o$;UFxh-sBvGtihn2`;bxh-wZJGO$cU`F=FQk$}K-|pGiR?N)p zOI8JEORKQ@%5I8(#VW#n#Fy;kHDTwP@5(M&t+5Awx__~Idi*ZGCDN~f?O}0xw)0bL z_Wb-2s~u*~hHyN$_s%TgIdZN?b)=HBkd~$i^E3*I5{zdvi)CHD( zAMz5zo2`btw)2qnc3vT$2yT%x9HLi+E{Wgk%3h(()H4Y-;o0^IJGzOt*j0AIUB}$I z>LFz{@tToU#<=gp2M(*&R~N zW8SLD^v-AD4D&ml;;dUcvMZ`IqpCl!8hH&jxg8Q$J<#x!Pl0M;8#IxgseLEf5W6{J zME(;vv^8luDQKkUCXKE^C~QW}EME+qY-VyU$y*3n2qx?01~9l3oYiF9BIz zZS-?{Nyh4-*Yr(@)P;OZmL)^|oq*f!{LsVd&Zhr+9SpnB55SeCD_CFgo|Cn7j8ON| zu@wD92db1_|F;5%89NV{Ctxb-yym9;5i=+}W1YCp>Vgao`ZH~2xp_CTPk2g?*l~m{ p1|`fRPUJQ9^Yx#y^olLWH0O4@aN9Wr+sK|UHs9s*R;9G7 c.name)); -} catch (e) { - console.error(e); -} finally { - db.close(); -} diff --git a/query_db.js b/query_db.js deleted file mode 100644 index 11215b8..0000000 --- a/query_db.js +++ /dev/null @@ -1,16 +0,0 @@ -const Database = require('better-sqlite3'); -const db = new Database('d:/workspace/AuraK/data/metadata.db'); - -try { - const session = db.prepare('SELECT id, messages FROM assessment_sessions WHERE messages IS NOT NULL AND messages != "[]" ORDER BY created_at DESC LIMIT 1').get(); - if (session) { - console.log('ID:', session.id); - console.log('MESSAGES:', session.messages); - } else { - console.log('No sessions with messages found.'); - } -} catch (e) { - console.error(e); -} finally { - db.close(); -} diff --git a/remaining_4.txt b/remaining_4.txt deleted file mode 100644 index 75dcb56..0000000 --- a/remaining_4.txt +++ /dev/null @@ -1,4 +0,0 @@ -d:\workspace\AuraK\web\components\GroupSelector.tsx -d:\workspace\AuraK\web\services\geminiService.ts -d:\workspace\AuraK\server\src\chat\chat.controller.ts -d:\workspace\AuraK\server\src\vision-pipeline\cost-control.service.ts \ No newline at end of file diff --git a/remaining_cjk.txt b/remaining_cjk.txt deleted file mode 100644 index bb1a32d39d5f5b657a04babd9cf0e6ac78ff70b3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 81072 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 bLv>lsU(#=<*jG lines.length - 5)) { - addMissingUsedKeys(currentLang, resultLines, keysSeen); - currentLang = null; - resultLines.push(line); - continue; - } - } - - resultLines.push(line); -} - -function addMissingUsedKeys(lang, targetLines, seen) { - for (const key of usedKeys) { - if (!seen.has(key)) { - const val = key; - const quotedKey = isValidIdentifier(key) ? key : `"${key}"`; - targetLines.push(` ${quotedKey}: ${JSON.stringify(val)},`); - seen.add(key); - } - } -} - -fs.writeFileSync(translationsPath, resultLines.join('\n'), 'utf8'); -console.log('Final sync (with proper identifier quoting) complete!'); diff --git a/test-feishu-assessment.js b/test-feishu-assessment.js deleted file mode 100644 index 662e8e5..0000000 --- a/test-feishu-assessment.js +++ /dev/null @@ -1,42 +0,0 @@ -/** - * 飞书机器人与人才测评集成测试脚本 - * 用于验证命令解析和会话管理功能 - */ - -const AssessmentCommandParser = require('./server/src/feishu/services/assessment-command.parser').AssessmentCommandParser; - -// 创建命令解析器实例 -const parser = new AssessmentCommandParser(); - -// 测试命令解析 -console.log('=== 测试命令解析 ==='); - -const testCommands = [ - '/assessment start', - '/assessment start kb_xxx', - '/assessment start tmpl_xxx', - '/assessment answer 这是我的答案', - '/assessment status', - '/assessment result', - '/assessment help', - '/assessment cancel', - '/测评 开始', - '/测评回答 我的答案', - '普通聊天消息', -]; - -testCommands.forEach(cmd => { - const result = parser.parse(cmd); - console.log(`命令: "${cmd}"`); - console.log(`结果:`, result ? `${result.type} (${result.parameters.join(', ')})` : '非测评命令'); - console.log('---'); -}); - -// 测试命令识别 -console.log('\n=== 测试命令识别 ==='); -testCommands.forEach(cmd => { - const isCommand = parser.isAssessmentCommand(cmd); - console.log(`"${cmd}" -> ${isCommand ? '测评命令' : '普通消息'}`); -}); - -console.log('\n=== 测试完成 ==='); diff --git a/test-graph.js b/test-graph.js deleted file mode 100644 index 3fcfb95..0000000 --- a/test-graph.js +++ /dev/null @@ -1,41 +0,0 @@ - -const { createEvaluationGraph } = require('./server/src/assessment/graph/builder'); -const { HumanMessage } = require('@langchain/core/messages'); - -async function testGraph() { - const graph = createEvaluationGraph(); - const config = { - configurable: { - thread_id: "test-session", - model: { - invoke: async (msgs) => { - console.log("Mock Model Invoked with:", msgs[0].content); - if (msgs[0].content.includes("考官")) { - return { content: JSON.stringify({ score: 9, feedback: "Good job", should_follow_up: false }) }; - } - if (msgs[0].content.includes("教育顾问")) { - return { content: "LEVEL: Proficient\nThis is a test report." }; - } - return { content: JSON.stringify([{ question_text: "Test Question?", key_points: ["A"], difficulty: "Medium", basis: "[1]..." }]) }; - } - }, - knowledgeBaseContent: "This is test content.", - language: "zh" - } - }; - - console.log("--- Starting Session ---"); - let state = await graph.invoke({ messages: [new HumanMessage("Start")] }, config); - console.log("Interviewer said:", state.messages[state.messages.length - 1].content); - console.log("Questions length:", state.questions.length); - console.log("Current Index:", state.currentQuestionIndex); - - console.log("\n--- Submitting Answer ---"); - state = await graph.invoke({ messages: [new HumanMessage("My answer")] }, config); - console.log("Interviewer said:", state.messages[state.messages.length - 1].content); - console.log("Current Index:", state.currentQuestionIndex); - console.log("Report:", state.report); -} - -// Note: This script needs the environment set up correctly to run. -// Since I can't easily run it with all dependencies, I'll rely on manual analysis first. diff --git a/test-systematic.mjs b/test-systematic.mjs index fbff9ce..61d8915 100644 --- a/test-systematic.mjs +++ b/test-systematic.mjs @@ -208,8 +208,8 @@ async function run() { // 5.1 并发 const [rA, rB] = await Promise.all([ - api(adminT, 'POST', '/users', { username: 'z-race-' + Date.now(), password: 'Pass1234' }), - api(adminT, 'POST', '/users', { username: 'z-race-' + Date.now(), password: 'Pass1234' }), + api(adminT, 'POST', '/users', { username: 'z-race-a-' + Date.now(), password: 'Pass1234' }), + api(adminT, 'POST', '/users', { username: 'z-race-b-' + Date.now(), password: 'Pass1234' }), ]); assert('5.1', '并发不同名不冲突', rA.status < 300 && rB.status < 300); if (rA.status < 300) await api(adminT, 'DELETE', '/users/' + (rA.data?.user?.id || rA.data?.id)); diff --git a/test_admin_features.md b/test_admin_features.md deleted file mode 100644 index 188b01b..0000000 --- a/test_admin_features.md +++ /dev/null @@ -1,32 +0,0 @@ -# Admin Feature Verification Test Cases - -## 1. User Management Access Control -- [ ] Non-admin users should NOT see the "User Management" menu item -- [ ] Admin users should see the "User Management" menu item -- [ ] Non-admin users attempting to access user management should get a permission error -- [ ] Admin users should be able to access user management successfully - -## 2. Admin User Password Modification -- [ ] Admin users should see a "Change Password" button for each user in the user list -- [ ] Clicking the button should open a password change modal -- [ ] Admin users should be able to submit new passwords for other users -- [ ] The password change should persist in the backend -- [ ] Non-admin users should not have access to this functionality - -## 3. Knowledge Base Upload Restrictions -- [ ] Non-admin users should NOT see the "Upload File" button in Knowledge Base View -- [ ] Admin users should see the "Upload File" button in Knowledge Base View -- [ ] Non-admin users attempting to upload directly via API should get a permission error -- [ ] Admin users should be able to upload files successfully - -## 4. Knowledge Group Upload Restrictions -- [ ] Non-admin users should NOT see the "Add File" or "Import Folder" buttons in Knowledge Group View -- [ ] Admin users should see the "Add File" and "Import Folder" buttons in Knowledge Group View -- [ ] Non-admin users attempting to upload via API should get a permission error -- [ ] Admin users should be able to upload files to knowledge groups successfully - -## 5. Backend Security -- [ ] Upload endpoints (POST /upload and POST /upload/text) should require AdminGuard -- [ ] Import task endpoint (POST /import-tasks) should require AdminGuard -- [ ] User update endpoint (PUT /users/:id) should accept password changes from admins -- [ ] All existing functionality should remain operational for authorized users \ No newline at end of file diff --git a/tm_schema.txt b/tm_schema.txt deleted file mode 100644 index 2f0965c..0000000 --- a/tm_schema.txt +++ /dev/null @@ -1 +0,0 @@ -CREATE TABLE IF NOT EXISTS "tenant_members" ("id" varchar PRIMARY KEY NOT NULL, "user_id" varchar NOT NULL, "tenant_id" varchar NOT NULL, "role" varchar CHECK( "role" IN ('SUPER_ADMIN','TENANT_ADMIN','USER') ) NOT NULL DEFAULT ('USER'), "created_at" datetime NOT NULL DEFAULT (datetime('now')), "updated_at" datetime NOT NULL DEFAULT (datetime('now')), CONSTRAINT "FK_396d571d91da471867fcfbdd2e4" FOREIGN KEY ("user_id") REFERENCES "users" ("id") ON DELETE CASCADE ON UPDATE NO ACTION, CONSTRAINT "FK_ffba0c9ecd4fd98550b3300ae68" FOREIGN KEY ("tenant_id") REFERENCES "tenants" ("id") ON DELETE CASCADE ON UPDATE NO ACTION); diff --git a/tmp_duplicates.txt b/tmp_duplicates.txt deleted file mode 100644 index 43404d2..0000000 --- a/tmp_duplicates.txt +++ /dev/null @@ -1,2090 +0,0 @@ -zh Duplicate key: embeddingModel (line 659) -zh Duplicate key: chunkSize (line 681) -zh Duplicate key: chunkOverlap (line 682) -zh Duplicate key: rerankSimilarityThreshold (line 685) -zh Duplicate key: importFolder (line 700) -zh Duplicate key: files (line 705) -zh Duplicate key: noteTitlePlaceholder (line 775) -zh Duplicate key: uncategorized (line 782) -zh Duplicate key: aiCommandsError (line 791) -zh Duplicate key: appTitle (line 792) -zh Duplicate key: loginTitle (line 793) -zh Duplicate key: loginDesc (line 794) -zh Duplicate key: loginButton (line 795) -zh Duplicate key: loginError (line 796) -zh Duplicate key: unknownError (line 797) -zh Duplicate key: usernamePlaceholder (line 798) -zh Duplicate key: passwordPlaceholder (line 799) -zh Duplicate key: registerButton (line 800) -zh Duplicate key: confirm (line 801) -zh Duplicate key: cancel (line 802) -zh Duplicate key: confirmTitle (line 803) -zh Duplicate key: confirmDeleteGroup (line 804) -zh Duplicate key: systemConfiguration (line 806) -zh Duplicate key: noFiles (line 807) -zh Duplicate key: noFilesDesc (line 808) -zh Duplicate key: addFile (line 809) -zh Duplicate key: clearAll (line 810) -zh Duplicate key: uploading (line 811) -zh Duplicate key: editNotebookTitle (line 812) -zh Duplicate key: noteCreatedSuccess (line 813) -zh Duplicate key: noteCreatedFailed (line 814) -zh Duplicate key: errorRenderFlowchart (line 815) -zh Duplicate key: errorLoadData (line 816) -zh Duplicate key: confirmUnsupportedFile (line 817) -zh Duplicate key: errorReadFile (line 818) -zh Duplicate key: successUploadFile (line 819) -zh Duplicate key: errorUploadFile (line 820) -zh Duplicate key: fileAddedToGroup (line 821) -zh Duplicate key: failedToAddToGroup (line 822) -zh Duplicate key: fileRemovedFromGroup (line 823) -zh Duplicate key: failedToRemoveFromGroup (line 824) -zh Duplicate key: errorProcessFile (line 825) -zh Duplicate key: errorTitleContentRequired (line 826) -zh Duplicate key: successNoteUpdated (line 827) -zh Duplicate key: successNoteCreated (line 828) -zh Duplicate key: errorSaveFailed (line 829) -zh Duplicate key: confirmDeleteNote (line 830) -zh Duplicate key: successNoteDeleted (line 831) -zh Duplicate key: confirmRemoveFileFromGroup (line 832) -zh Duplicate key: togglePreviewOpen (line 833) -zh Duplicate key: togglePreviewClose (line 834) -zh Duplicate key: noteTitlePlaceholder (line 835) -zh Duplicate key: noteContentPlaceholder (line 836) -zh Duplicate key: markdownPreviewArea (line 837) -zh Duplicate key: back (line 838) -zh Duplicate key: chatWithGroup (line 839) -zh Duplicate key: chatWithFile (line 840) -zh Duplicate key: filesCountLabel (line 841) -zh Duplicate key: notesCountLabel (line 842) -zh Duplicate key: indexIntoKB (line 843) -zh Duplicate key: noFilesOrNotes (line 844) -zh Duplicate key: sidebarTitle (line 846) -zh Duplicate key: backToWorkspace (line 847) -zh Duplicate key: goToAdmin (line 848) -zh Duplicate key: sidebarDesc (line 849) -zh Duplicate key: tabFiles (line 850) -zh Duplicate key: files (line 851) -zh Duplicate key: notes (line 852) -zh Duplicate key: tabSettings (line 853) -zh Duplicate key: langZh (line 854) -zh Duplicate key: langEn (line 855) -zh Duplicate key: langJa (line 856) -zh Duplicate key: navGlobal (line 857) -zh Duplicate key: navTenants (line 858) -zh Duplicate key: navSystemModels (line 859) -zh Duplicate key: navTenantManagement (line 860) -zh Duplicate key: navUsersTeam (line 861) -zh Duplicate key: navTenantSettings (line 862) -zh Duplicate key: adminConsole (line 863) -zh Duplicate key: globalDashboard (line 864) -zh Duplicate key: statusIndexing (line 865) -zh Duplicate key: statusReady (line 866) -zh Duplicate key: ragSettings (line 869) -zh Duplicate key: enableRerank (line 870) -zh Duplicate key: enableRerankDesc (line 871) -zh Duplicate key: selectRerankModel (line 872) -zh Duplicate key: selectModelPlaceholder (line 873) -zh Duplicate key: headerModelSelection (line 875) -zh Duplicate key: headerHyperparams (line 876) -zh Duplicate key: headerIndexing (line 877) -zh Duplicate key: headerRetrieval (line 878) -zh Duplicate key: btnManageModels (line 879) -zh Duplicate key: lblLLM (line 881) -zh Duplicate key: lblEmbedding (line 882) -zh Duplicate key: lblRerankRef (line 883) -zh Duplicate key: lblTemperature (line 884) -zh Duplicate key: lblMaxTokens (line 885) -zh Duplicate key: lblChunkSize (line 886) -zh Duplicate key: lblChunkOverlap (line 887) -zh Duplicate key: lblTopK (line 888) -zh Duplicate key: lblRerank (line 889) -zh Duplicate key: idxModalTitle (line 891) -zh Duplicate key: idxDesc (line 892) -zh Duplicate key: idxFiles (line 893) -zh Duplicate key: idxMethod (line 894) -zh Duplicate key: idxEmbeddingModel (line 895) -zh Duplicate key: idxStart (line 896) -zh Duplicate key: idxCancel (line 897) -zh Duplicate key: idxAuto (line 898) -zh Duplicate key: idxCustom (line 899) -zh Duplicate key: mmTitle (line 901) -zh Duplicate key: mmAddBtn (line 902) -zh Duplicate key: mmEdit (line 903) -zh Duplicate key: mmDelete (line 904) -zh Duplicate key: mmEmpty (line 905) -zh Duplicate key: mmFormName (line 906) -zh Duplicate key: mmFormProvider (line 907) -zh Duplicate key: mmFormModelId (line 908) -zh Duplicate key: mmFormBaseUrl (line 909) -zh Duplicate key: mmFormType (line 910) -zh Duplicate key: mmFormVision (line 911) -zh Duplicate key: mmFormDimensions (line 912) -zh Duplicate key: mmFormDimensionsHelp (line 913) -zh Duplicate key: mmSave (line 914) -zh Duplicate key: mmCancel (line 915) -zh Duplicate key: mmErrorNotAuthenticated (line 916) -zh Duplicate key: mmErrorTitle (line 917) -zh Duplicate key: modelEnabled (line 918) -zh Duplicate key: modelDisabled (line 919) -zh Duplicate key: confirmChangeEmbeddingModel (line 920) -zh Duplicate key: embeddingModelWarning (line 921) -zh Duplicate key: sourcePreview (line 922) -zh Duplicate key: matchScore (line 923) -zh Duplicate key: copyContent (line 924) -zh Duplicate key: copySuccess (line 925) -zh Duplicate key: selectLLMModel (line 928) -zh Duplicate key: selectEmbeddingModel (line 929) -zh Duplicate key: defaultForUploads (line 930) -zh Duplicate key: noRerankModel (line 931) -zh Duplicate key: vectorSimilarityThreshold (line 932) -zh Duplicate key: rerankSimilarityThreshold (line 933) -zh Duplicate key: filterLowResults (line 934) -zh Duplicate key: fullTextSearch (line 935) -zh Duplicate key: hybridVectorWeight (line 936) -zh Duplicate key: hybridVectorWeightDesc (line 937) -zh Duplicate key: lblQueryExpansion (line 938) -zh Duplicate key: lblHyDE (line 939) -zh Duplicate key: lblQueryExpansionDesc (line 940) -zh Duplicate key: lblHyDEDesc (line 941) -zh Duplicate key: apiKeyValidationFailed (line 943) -zh Duplicate key: keepOriginalKey (line 944) -zh Duplicate key: leaveEmptyNoChange (line 945) -zh Duplicate key: mmFormApiKey (line 946) -zh Duplicate key: mmFormApiKeyPlaceholder (line 947) -zh Duplicate key: reconfigureFile (line 950) -zh Duplicate key: modifySettings (line 951) -zh Duplicate key: filesCount (line 952) -zh Duplicate key: allFilesIndexed (line 953) -zh Duplicate key: noEmbeddingModels (line 954) -zh Duplicate key: reconfigure (line 955) -zh Duplicate key: refresh (line 956) -zh Duplicate key: settings (line 957) -zh Duplicate key: needLogin (line 958) -zh Duplicate key: citationSources (line 959) -zh Duplicate key: chunkNumber (line 960) -zh Duplicate key: getUserListFailed (line 961) -zh Duplicate key: usernamePasswordRequired (line 962) -zh Duplicate key: passwordMinLength (line 963) -zh Duplicate key: userCreatedSuccess (line 964) -zh Duplicate key: createUserFailed (line 965) -zh Duplicate key: userPromotedToAdmin (line 966) -zh Duplicate key: userDemotedFromAdmin (line 967) -zh Duplicate key: updateUserFailed (line 968) -zh Duplicate key: confirmDeleteUser (line 969) -zh Duplicate key: deleteUser (line 970) -zh Duplicate key: deleteUserFailed (line 971) -zh Duplicate key: userDeletedSuccessfully (line 972) -zh Duplicate key: makeUserAdmin (line 973) -zh Duplicate key: makeUserRegular (line 974) -zh Duplicate key: loading (line 975) -zh Duplicate key: noUsers (line 976) -zh Duplicate key: aiAssistant (line 979) -zh Duplicate key: polishContent (line 980) -zh Duplicate key: expandContent (line 981) -zh Duplicate key: summarizeContent (line 982) -zh Duplicate key: translateToEnglish (line 983) -zh Duplicate key: fixGrammar (line 984) -zh Duplicate key: aiCommandInstructPolish (line 985) -zh Duplicate key: aiCommandInstructExpand (line 986) -zh Duplicate key: aiCommandInstructSummarize (line 987) -zh Duplicate key: aiCommandInstructTranslateToEn (line 988) -zh Duplicate key: aiCommandInstructFixGrammar (line 989) -zh Duplicate key: aiCommandsPreset (line 990) -zh Duplicate key: aiCommandsCustom (line 991) -zh Duplicate key: aiCommandsCustomPlaceholder (line 992) -zh Duplicate key: aiCommandsReferenceContext (line 993) -zh Duplicate key: aiCommandsStartGeneration (line 994) -zh Duplicate key: aiCommandsResult (line 995) -zh Duplicate key: aiCommandsGenerating (line 996) -zh Duplicate key: aiCommandsApplyResult (line 997) -zh Duplicate key: aiCommandsGoBack (line 998) -zh Duplicate key: aiCommandsReset (line 999) -zh Duplicate key: aiCommandsModalPreset (line 1000) -zh Duplicate key: aiCommandsModalCustom (line 1001) -zh Duplicate key: aiCommandsModalCustomPlaceholder (line 1002) -zh Duplicate key: aiCommandsModalBasedOnSelection (line 1003) -zh Duplicate key: aiCommandsModalResult (line 1004) -zh Duplicate key: aiCommandsModalApply (line 1005) -zh Duplicate key: fillAllFields (line 1008) -zh Duplicate key: passwordMismatch (line 1009) -zh Duplicate key: newPasswordMinLength (line 1010) -zh Duplicate key: changePasswordFailed (line 1011) -zh Duplicate key: changePasswordTitle (line 1012) -zh Duplicate key: changing (line 1013) -zh Duplicate key: searchResults (line 1014) -zh Duplicate key: visionModelSettings (line 1017) -zh Duplicate key: defaultVisionModel (line 1018) -zh Duplicate key: loadVisionModelFailed (line 1019) -zh Duplicate key: loadFailed (line 1020) -zh Duplicate key: saveVisionModelFailed (line 1021) -zh Duplicate key: noVisionModels (line 1022) -zh Duplicate key: selectVisionModel (line 1023) -zh Duplicate key: visionModelHelp (line 1024) -zh Duplicate key: mmErrorNameRequired (line 1025) -zh Duplicate key: mmErrorModelIdRequired (line 1026) -zh Duplicate key: mmErrorBaseUrlRequired (line 1027) -zh Duplicate key: mmRequiredAsterisk (line 1028) -zh Duplicate key: typeLLM (line 1030) -zh Duplicate key: typeEmbedding (line 1031) -zh Duplicate key: typeRerank (line 1032) -zh Duplicate key: typeVision (line 1033) -zh Duplicate key: welcome (line 1035) -zh Duplicate key: placeholderWithFiles (line 1036) -zh Duplicate key: placeholderEmpty (line 1037) -zh Duplicate key: analyzing (line 1038) -zh Duplicate key: errorGeneric (line 1039) -zh Duplicate key: errorLabel (line 1040) -zh Duplicate key: errorNoModel (line 1041) -zh Duplicate key: aiDisclaimer (line 1042) -zh Duplicate key: confirmClear (line 1043) -zh Duplicate key: removeFile (line 1044) -zh Duplicate key: apiError (line 1045) -zh Duplicate key: geminiError (line 1046) -zh Duplicate key: processedButNoText (line 1047) -zh Duplicate key: unitByte (line 1048) -zh Duplicate key: readingFailed (line 1049) -zh Duplicate key: copy (line 1051) -zh Duplicate key: copied (line 1052) -zh Duplicate key: logout (line 1055) -zh Duplicate key: changePassword (line 1056) -zh Duplicate key: userManagement (line 1057) -zh Duplicate key: userList (line 1058) -zh Duplicate key: addUser (line 1059) -zh Duplicate key: username (line 1060) -zh Duplicate key: password (line 1061) -zh Duplicate key: confirmPassword (line 1062) -zh Duplicate key: currentPassword (line 1063) -zh Duplicate key: newPassword (line 1064) -zh Duplicate key: createUser (line 1065) -zh Duplicate key: admin (line 1066) -zh Duplicate key: user (line 1067) -zh Duplicate key: adminUser (line 1068) -zh Duplicate key: confirmChange (line 1069) -zh Duplicate key: changeUserPassword (line 1070) -zh Duplicate key: enterNewPassword (line 1071) -zh Duplicate key: createdAt (line 1072) -zh Duplicate key: newChat (line 1073) -zh Duplicate key: selectKnowledgeGroups (line 1076) -zh Duplicate key: searchGroupsPlaceholder (line 1077) -zh Duplicate key: done (line 1078) -zh Duplicate key: all (line 1079) -zh Duplicate key: noGroupsFound (line 1080) -zh Duplicate key: noGroups (line 1081) -zh Duplicate key: autoRefresh (line 1084) -zh Duplicate key: refreshInterval (line 1085) -zh Duplicate key: kbManagement (line 1088) -zh Duplicate key: kbManagementDesc (line 1089) -zh Duplicate key: searchPlaceholder (line 1090) -zh Duplicate key: allGroups (line 1091) -zh Duplicate key: allStatus (line 1092) -zh Duplicate key: statusReadyFragment (line 1093) -zh Duplicate key: statusFailedFragment (line 1094) -zh Duplicate key: statusIndexingFragment (line 1095) -zh Duplicate key: uploadFile (line 1096) -zh Duplicate key: fileName (line 1097) -zh Duplicate key: size (line 1098) -zh Duplicate key: status (line 1099) -zh Duplicate key: groups (line 1100) -zh Duplicate key: actions (line 1101) -zh Duplicate key: groupsActions (line 1102) -zh Duplicate key: noFilesFound (line 1103) -zh Duplicate key: showingRange (line 1104) -zh Duplicate key: confirmDeleteFile (line 1105) -zh Duplicate key: fileDeleted (line 1106) -zh Duplicate key: deleteFailed (line 1107) -zh Duplicate key: confirmClearKB (line 1108) -zh Duplicate key: kbCleared (line 1109) -zh Duplicate key: clearFailed (line 1110) -zh Duplicate key: actionFailed (line 1111) -zh Duplicate key: groupCreated (line 1112) -zh Duplicate key: groupUpdated (line 1113) -zh Duplicate key: groupDeleted (line 1114) -zh Duplicate key: groupManagement (line 1115) -zh Duplicate key: loginRequired (line 1116) -zh Duplicate key: uploadErrors (line 1117) -zh Duplicate key: uploadWarning (line 1118) -zh Duplicate key: uploadFailed (line 1119) -zh Duplicate key: preview (line 1120) -zh Duplicate key: addGroup (line 1121) -zh Duplicate key: delete (line 1122) -zh Duplicate key: retry (line 1123) -zh Duplicate key: retrying (line 1124) -zh Duplicate key: retrySuccess (line 1125) -zh Duplicate key: retryFailed (line 1126) -zh Duplicate key: chunkInfo (line 1127) -zh Duplicate key: totalChunks (line 1128) -zh Duplicate key: chunkIndex (line 1129) -zh Duplicate key: contentLength (line 1130) -zh Duplicate key: position (line 1131) -zh Duplicate key: reconfigureTitle (line 1134) -zh Duplicate key: reconfigureDesc (line 1135) -zh Duplicate key: indexingConfigTitle (line 1136) -zh Duplicate key: indexingConfigDesc (line 1137) -zh Duplicate key: pendingFiles (line 1138) -zh Duplicate key: processingMode (line 1139) -zh Duplicate key: analyzingFile (line 1140) -zh Duplicate key: recommendationReason (line 1141) -zh Duplicate key: fastMode (line 1142) -zh Duplicate key: fastModeDesc (line 1143) -zh Duplicate key: preciseMode (line 1144) -zh Duplicate key: preciseModeDesc (line 1145) -zh Duplicate key: fastModeFeatures (line 1146) -zh Duplicate key: fastFeature1 (line 1147) -zh Duplicate key: fastFeature2 (line 1148) -zh Duplicate key: fastFeature3 (line 1149) -zh Duplicate key: fastFeature4 (line 1150) -zh Duplicate key: fastFeature5 (line 1151) -zh Duplicate key: preciseModeFeatures (line 1152) -zh Duplicate key: preciseFeature1 (line 1153) -zh Duplicate key: preciseFeature2 (line 1154) -zh Duplicate key: preciseFeature3 (line 1155) -zh Duplicate key: preciseFeature4 (line 1156) -zh Duplicate key: preciseFeature5 (line 1157) -zh Duplicate key: preciseFeature6 (line 1158) -zh Duplicate key: embeddingModel (line 1159) -zh Duplicate key: pleaseSelect (line 1160) -zh Duplicate key: pleaseSelectKnowledgeGroupFirst (line 1161) -zh Duplicate key: selectUnassignGroupWarning (line 1162) -zh Duplicate key: chunkConfig (line 1163) -zh Duplicate key: chunkSize (line 1164) -zh Duplicate key: min (line 1165) -zh Duplicate key: max (line 1166) -zh Duplicate key: chunkOverlap (line 1167) -zh Duplicate key: modelLimitsInfo (line 1168) -zh Duplicate key: model (line 1169) -zh Duplicate key: maxChunkSize (line 1170) -zh Duplicate key: maxOverlapSize (line 1171) -zh Duplicate key: maxBatchSize (line 1172) -zh Duplicate key: envLimitWeaker (line 1173) -zh Duplicate key: optimizationTips (line 1174) -zh Duplicate key: tipChunkTooLarge (line 1175) -zh Duplicate key: tipOverlapSmall (line 1176) -zh Duplicate key: tipMaxValues (line 1177) -zh Duplicate key: tipPreciseCost (line 1178) -zh Duplicate key: selectEmbeddingFirst (line 1179) -zh Duplicate key: confirmPreciseCost (line 1180) -zh Duplicate key: startProcessing (line 1181) -zh Duplicate key: notebooks (line 1184) -zh Duplicate key: notebooksDesc (line 1185) -zh Duplicate key: createNotebook (line 1186) -zh Duplicate key: chatWithNotebook (line 1187) -zh Duplicate key: editNotebook (line 1188) -zh Duplicate key: deleteNotebook (line 1189) -zh Duplicate key: noDescription (line 1190) -zh Duplicate key: noNotebooks (line 1193) -zh Duplicate key: createFailed (line 1194) -zh Duplicate key: confirmDeleteNotebook (line 1195) -zh Duplicate key: createNotebookTitle (line 1202) -zh Duplicate key: createFailedRetry (line 1203) -zh Duplicate key: updateFailedRetry (line 1204) -zh Duplicate key: name (line 1205) -zh Duplicate key: nameHelp (line 1206) -zh Duplicate key: namePlaceholder (line 1207) -zh Duplicate key: shortDescription (line 1208) -zh Duplicate key: descPlaceholder (line 1209) -zh Duplicate key: creating (line 1213) -zh Duplicate key: createNow (line 1214) -zh Duplicate key: saving (line 1215) -zh Duplicate key: save (line 1216) -zh Duplicate key: chatTitle (line 1219) -zh Duplicate key: chatDesc (line 1220) -zh Duplicate key: viewHistory (line 1221) -zh Duplicate key: saveSettingsFailed (line 1222) -zh Duplicate key: loginToUpload (line 1223) -zh Duplicate key: fileSizeLimitExceeded (line 1224) -zh Duplicate key: unsupportedFileType (line 1225) -zh Duplicate key: readFailed (line 1226) -zh Duplicate key: loadHistoryFailed (line 1227) -zh Duplicate key: loadingUserData (line 1228) -zh Duplicate key: errorMessage (line 1229) -zh Duplicate key: welcomeMessage (line 1230) -zh Duplicate key: selectKnowledgeGroup (line 1231) -zh Duplicate key: allKnowledgeGroups (line 1232) -zh Duplicate key: unknownGroup (line 1233) -zh Duplicate key: selectedGroupsCount (line 1234) -zh Duplicate key: generalSettings (line 1237) -zh Duplicate key: modelManagement (line 1238) -zh Duplicate key: languageSettings (line 1239) -zh Duplicate key: passwordChangeSuccess (line 1240) -zh Duplicate key: passwordChangeFailed (line 1241) -zh Duplicate key: create (line 1242) -zh Duplicate key: validationFailedMsg (line 1243) -zh Duplicate key: navChat (line 1247) -zh Duplicate key: navCoach (line 1248) -zh Duplicate key: navKnowledge (line 1249) -zh Duplicate key: navKnowledgeGroups (line 1250) -zh Duplicate key: navNotebook (line 1251) -zh Duplicate key: notebookDesc (line 1252) -zh Duplicate key: newNote (line 1253) -zh Duplicate key: editNote (line 1254) -zh Duplicate key: noNotesFound (line 1255) -zh Duplicate key: startByCreatingNote (line 1256) -zh Duplicate key: navCrawler (line 1257) -zh Duplicate key: expandMenu (line 1258) -zh Duplicate key: switchLanguage (line 1259) -zh Duplicate key: importFolder (line 1261) -zh Duplicate key: createPDFNote (line 1264) -zh Duplicate key: screenshotPreview (line 1265) -zh Duplicate key: associateKnowledgeGroup (line 1266) -zh Duplicate key: globalNoSpecificGroup (line 1267) -zh Duplicate key: title (line 1268) -zh Duplicate key: enterNoteTitle (line 1269) -zh Duplicate key: contentOCR (line 1270) -zh Duplicate key: extractingText (line 1271) -zh Duplicate key: analyzingImage (line 1272) -zh Duplicate key: noTextExtracted (line 1273) -zh Duplicate key: saveNote (line 1274) -zh Duplicate key: page (line 1277) -zh Duplicate key: placeholderText (line 1278) -zh Duplicate key: createNewNotebook (line 1281) -zh Duplicate key: nameField (line 1282) -zh Duplicate key: required (line 1283) -zh Duplicate key: exampleResearch (line 1284) -zh Duplicate key: shortDescriptionField (line 1285) -zh Duplicate key: describePurpose (line 1286) -zh Duplicate key: creationFailed (line 1289) -zh Duplicate key: preparingPDFConversion (line 1292) -zh Duplicate key: pleaseWait (line 1293) -zh Duplicate key: convertingPDF (line 1294) -zh Duplicate key: pdfConversionFailed (line 1295) -zh Duplicate key: pdfConversionError (line 1296) -zh Duplicate key: pdfLoadFailed (line 1297) -zh Duplicate key: pdfLoadError (line 1298) -zh Duplicate key: downloadingPDF (line 1299) -zh Duplicate key: loadingPDF (line 1300) -zh Duplicate key: zoomOut (line 1301) -zh Duplicate key: zoomIn (line 1302) -zh Duplicate key: resetZoom (line 1303) -zh Duplicate key: selectPageNumber (line 1304) -zh Duplicate key: enterPageNumber (line 1305) -zh Duplicate key: exitSelectionMode (line 1306) -zh Duplicate key: clickToSelectAndNote (line 1307) -zh Duplicate key: regeneratePDF (line 1308) -zh Duplicate key: downloadPDF (line 1309) -zh Duplicate key: openInNewWindow (line 1310) -zh Duplicate key: exitFullscreen (line 1311) -zh Duplicate key: fullscreenDisplay (line 1312) -zh Duplicate key: pdfPreview (line 1313) -zh Duplicate key: converting (line 1314) -zh Duplicate key: generatePDFPreview (line 1315) -zh Duplicate key: previewNotSupported (line 1316) -zh Duplicate key: confirmRegeneratePDF (line 1319) -zh Duplicate key: pdfPreviewReady (line 1322) -zh Duplicate key: convertingInProgress (line 1323) -zh Duplicate key: conversionFailed (line 1324) -zh Duplicate key: generatePDFPreviewButton (line 1325) -zh Duplicate key: checkPDFStatusFailed (line 1328) -zh Duplicate key: requestRegenerationFailed (line 1329) -zh Duplicate key: downloadPDFFailed (line 1330) -zh Duplicate key: openPDFInNewTabFailed (line 1331) -zh Duplicate key: invalidFile (line 1334) -zh Duplicate key: incompleteFileInfo (line 1335) -zh Duplicate key: unsupportedFileFormat (line 1336) -zh Duplicate key: willUseFastMode (line 1337) -zh Duplicate key: formatNoPrecise (line 1338) -zh Duplicate key: smallFileFastOk (line 1339) -zh Duplicate key: mixedContentPreciseRecommended (line 1340) -zh Duplicate key: willIncurApiCost (line 1341) -zh Duplicate key: largeFilePreciseRecommended (line 1342) -zh Duplicate key: longProcessingTime (line 1343) -zh Duplicate key: highApiCost (line 1344) -zh Duplicate key: considerFileSplitting (line 1345) -zh Duplicate key: dragDropUploadTitle (line 1348) -zh Duplicate key: dragDropUploadDesc (line 1349) -zh Duplicate key: supportedFormats (line 1350) -zh Duplicate key: browseFiles (line 1351) -zh Duplicate key: recommendationMsg (line 1354) -zh Duplicate key: autoAdjustChunk (line 1355) -zh Duplicate key: autoAdjustOverlap (line 1356) -zh Duplicate key: autoAdjustOverlapMin (line 1357) -zh Duplicate key: loadLimitsFailed (line 1358) -zh Duplicate key: maxValueMsg (line 1359) -zh Duplicate key: overlapRatioLimit (line 1360) -zh Duplicate key: onlyAdminCanModify (line 1361) -zh Duplicate key: dragToSelect (line 1362) -zh Duplicate key: fillTargetName (line 1365) -zh Duplicate key: submitFailed (line 1366) -zh Duplicate key: importFolderTitle (line 1367) -zh Duplicate key: importFolderTip (line 1368) -zh Duplicate key: lblTargetGroup (line 1369) -zh Duplicate key: placeholderNewGroup (line 1370) -zh Duplicate key: importToCurrentGroup (line 1371) -zh Duplicate key: nextStep (line 1372) -zh Duplicate key: selectedFilesCount (line 1376) -zh Duplicate key: clickToSelectFolder (line 1377) -zh Duplicate key: selectFolderTip (line 1378) -zh Duplicate key: importComplete (line 1379) -zh Duplicate key: importedFromLocalFolder (line 1380) -zh Duplicate key: historyTitle (line 1383) -zh Duplicate key: confirmDeleteHistory (line 1384) -zh Duplicate key: deleteHistorySuccess (line 1385) -zh Duplicate key: deleteHistoryFailed (line 1386) -zh Duplicate key: yesterday (line 1387) -zh Duplicate key: daysAgo (line 1388) -zh Duplicate key: historyMessages (line 1389) -zh Duplicate key: noHistory (line 1390) -zh Duplicate key: noHistoryDesc (line 1391) -zh Duplicate key: loadMore (line 1392) -zh Duplicate key: loadingHistoriesFailed (line 1393) -zh Duplicate key: supportedFormatsInfo (line 1394) -zh Duplicate key: navCatalog (line 1397) -zh Duplicate key: allDocuments (line 1398) -zh Duplicate key: uncategorized (line 1399) -zh Duplicate key: categories (line 1400) -zh Duplicate key: uncategorizedFiles (line 1401) -zh Duplicate key: category (line 1402) -zh Duplicate key: statusReadyDesc (line 1403) -zh Duplicate key: statusIndexingDesc (line 1404) -zh Duplicate key: selectCategory (line 1405) -zh Duplicate key: noneUncategorized (line 1406) -zh Duplicate key: previous (line 1407) -zh Duplicate key: next (line 1408) -zh Duplicate key: editCategory (line 1409) -zh Duplicate key: createCategory (line 1410) -zh Duplicate key: categoryDesc (line 1411) -zh Duplicate key: categoryName (line 1412) -zh Duplicate key: saveChanges (line 1413) -zh Duplicate key: createCategoryBtn (line 1414) -zh Duplicate key: totalTenants (line 1417) -zh Duplicate key: systemUsers (line 1418) -zh Duplicate key: systemHealth (line 1419) -zh Duplicate key: operational (line 1420) -zh Duplicate key: orgManagement (line 1421) -zh Duplicate key: globalTenantControl (line 1422) -zh Duplicate key: newTenant (line 1423) -zh Duplicate key: tenantName (line 1424) -zh Duplicate key: domainOptional (line 1425) -zh Duplicate key: assignInitialAdmin (line 1426) -zh Duplicate key: selectUserOptional (line 1427) -zh Duplicate key: promoteToAdminWarning (line 1428) -zh Duplicate key: editOrganization (line 1429) -zh Duplicate key: createOrganization (line 1430) -zh Duplicate key: bindAdmin (line 1431) -zh Duplicate key: manageMembers (line 1432) -zh Duplicate key: currentMembers (line 1433) -zh Duplicate key: addMembers (line 1434) -zh Duplicate key: systemRestricted (line 1435) -zh Duplicate key: noUnassignedUsers (line 1436) -zh Duplicate key: enableNotebook (line 1437) -zh Duplicate key: disableNotebook (line 1438) -zh Duplicate key: featureUpdated (line 1439) -zh Duplicate key: kbSettingsSaved (line 1444) -zh Duplicate key: failedToSaveSettings (line 1445) -zh Duplicate key: modelConfiguration (line 1446) -zh Duplicate key: defaultLLMModel (line 1447) -zh Duplicate key: selectLLM (line 1448) -zh Duplicate key: embeddingModel (line 1449) -zh Duplicate key: selectEmbedding (line 1450) -zh Duplicate key: rerankModel (line 1451) -zh Duplicate key: none (line 1452) -zh Duplicate key: indexingChunkingConfig (line 1453) -zh Duplicate key: chatHyperparameters (line 1454) -zh Duplicate key: precise (line 1455) -zh Duplicate key: creative (line 1456) -zh Duplicate key: maxResponseTokens (line 1457) -zh Duplicate key: retrievalSearchSettings (line 1458) -zh Duplicate key: enableHybridSearch (line 1459) -zh Duplicate key: hybridSearchDesc (line 1460) -zh Duplicate key: hybridWeight (line 1461) -zh Duplicate key: pureText (line 1462) -zh Duplicate key: pureVector (line 1463) -zh Duplicate key: enableQueryExpansion (line 1464) -zh Duplicate key: queryExpansionDesc (line 1465) -zh Duplicate key: enableHyDE (line 1466) -zh Duplicate key: hydeDesc (line 1467) -zh Duplicate key: enableReranking (line 1468) -zh Duplicate key: rerankingDesc (line 1469) -zh Duplicate key: temperature (line 1470) -zh Duplicate key: chunkSize (line 1471) -zh Duplicate key: chunkOverlap (line 1472) -zh Duplicate key: topK (line 1473) -zh Duplicate key: similarityThreshold (line 1474) -zh Duplicate key: rerankSimilarityThreshold (line 1475) -zh Duplicate key: broad (line 1476) -zh Duplicate key: strict (line 1477) -zh Duplicate key: maxInput (line 1478) -zh Duplicate key: dimensions (line 1479) -zh Duplicate key: dims (line 1480) -zh Duplicate key: ctx (line 1481) -zh Duplicate key: baseApi (line 1482) -zh Duplicate key: configured (line 1483) -zh Duplicate key: defaultBadge (line 1484) -zh Duplicate key: roleTenantAdmin (line 1485) -zh Duplicate key: roleRegularUser (line 1486) -zh Duplicate key: creatingRegularUser (line 1487) -zh Duplicate key: importFolder (line 1490) -zh Duplicate key: newGroup (line 1491) -zh Duplicate key: noKnowledgeGroups (line 1492) -zh Duplicate key: createGroupDesc (line 1493) -zh Duplicate key: noDescriptionProvided (line 1494) -zh Duplicate key: files (line 1495) -zh Duplicate key: filterGroupFiles (line 1496) -zh Duplicate key: browseManageFiles (line 1497) -zh Duplicate key: navAgent (line 1500) -zh Duplicate key: agentTitle (line 1501) -zh Duplicate key: agentDesc (line 1502) -zh Duplicate key: searchAgent (line 1503) -zh Duplicate key: createAgent (line 1504) -zh Duplicate key: statusRunning (line 1505) -zh Duplicate key: statusStopped (line 1506) -zh Duplicate key: btnChat (line 1507) -zh Duplicate key: navPlugin (line 1510) -zh Duplicate key: pluginTitle (line 1511) -zh Duplicate key: pluginDesc (line 1512) -zh Duplicate key: searchPlugin (line 1513) -zh Duplicate key: installPlugin (line 1514) -zh Duplicate key: installedPlugin (line 1515) -zh Duplicate key: updatePlugin (line 1516) -zh Duplicate key: selectOrganization (line 1519) -zh Duplicate key: defaultTenant (line 1520) -zh Duplicate key: roleTenantAdmin (line 1521) -zh Duplicate key: roleRegularUser (line 1522) -zh Duplicate key: creatingRegularUser (line 1523) -zh Duplicate key: defaultBadge (line 1526) -zh Duplicate key: plugin1Name (line 1533) -zh Duplicate key: plugin1Desc (line 1534) -zh Duplicate key: plugin2Name (line 1535) -zh Duplicate key: plugin2Desc (line 1536) -zh Duplicate key: plugin3Name (line 1537) -zh Duplicate key: plugin3Desc (line 1538) -zh Duplicate key: plugin4Name (line 1539) -zh Duplicate key: plugin4Desc (line 1540) -zh Duplicate key: plugin5Name (line 1541) -zh Duplicate key: plugin5Desc (line 1542) -zh Duplicate key: plugin6Name (line 1543) -zh Duplicate key: plugin6Desc (line 1544) -zh Duplicate key: agent1Name (line 1545) -zh Duplicate key: agent1Desc (line 1546) -zh Duplicate key: agent1Time (line 1547) -zh Duplicate key: agent2Name (line 1548) -zh Duplicate key: agent2Desc (line 1549) -zh Duplicate key: agent2Time (line 1550) -zh Duplicate key: agent3Name (line 1551) -zh Duplicate key: agent3Desc (line 1552) -zh Duplicate key: agent3Time (line 1553) -zh Duplicate key: agent4Name (line 1554) -zh Duplicate key: agent4Desc (line 1555) -zh Duplicate key: agent4Time (line 1556) -zh Duplicate key: agent5Name (line 1557) -zh Duplicate key: agent5Desc (line 1558) -zh Duplicate key: agent5Time (line 1559) -zh Duplicate key: agent6Name (line 1560) -zh Duplicate key: agent6Desc (line 1561) -zh Duplicate key: agent6Time (line 1562) -zh Duplicate key: agent7Name (line 1563) -zh Duplicate key: agent7Desc (line 1564) -zh Duplicate key: agent7Time (line 1565) -zh Duplicate key: generalSettingsSubtitle (line 1566) -zh Duplicate key: userManagementSubtitle (line 1567) -zh Duplicate key: modelManagementSubtitle (line 1568) -zh Duplicate key: kbSettingsSubtitle (line 1569) -zh Duplicate key: tenantsSubtitle (line 1570) -zh Duplicate key: allNotes (line 1572) -zh Duplicate key: filterNotesPlaceholder (line 1573) -zh Duplicate key: noteTitlePlaceholder (line 1574) -zh Duplicate key: startWritingPlaceholder (line 1575) -zh Duplicate key: previewHeader (line 1576) -zh Duplicate key: noContentToPreview (line 1577) -zh Duplicate key: hidePreview (line 1578) -zh Duplicate key: showPreview (line 1579) -zh Duplicate key: directoryLabel (line 1580) -zh Duplicate key: uncategorized (line 1581) -zh Duplicate key: enterNamePlaceholder (line 1582) -zh Duplicate key: subFolderPlaceholder (line 1583) -zh Duplicate key: categoryCreated (line 1584) -zh Duplicate key: failedToCreateCategory (line 1585) -zh Duplicate key: failedToDeleteCategory (line 1586) -zh Duplicate key: confirmDeleteCategory (line 1587) -zh Duplicate key: aiCommandsError (line 1590) -zh Duplicate key: appTitle (line 1591) -zh Duplicate key: loginTitle (line 1592) -zh Duplicate key: loginDesc (line 1593) -zh Duplicate key: loginButton (line 1594) -zh Duplicate key: loginError (line 1595) -zh Duplicate key: unknownError (line 1596) -zh Duplicate key: usernamePlaceholder (line 1597) -zh Duplicate key: passwordPlaceholder (line 1598) -zh Duplicate key: registerButton (line 1599) -zh Duplicate key: langZh (line 1600) -zh Duplicate key: langEn (line 1601) -zh Duplicate key: langJa (line 1602) -zh Duplicate key: confirm (line 1603) -zh Duplicate key: cancel (line 1604) -zh Duplicate key: confirmTitle (line 1605) -zh Duplicate key: confirmDeleteGroup (line 1606) -zh Duplicate key: sidebarTitle (line 1608) -zh Duplicate key: backToWorkspace (line 1609) -zh Duplicate key: goToAdmin (line 1610) -zh Duplicate key: sidebarDesc (line 1611) -zh Duplicate key: tabFiles (line 1612) -zh Duplicate key: files (line 1613) -zh Duplicate key: notes (line 1614) -zh Duplicate key: tabSettings (line 1615) -zh Duplicate key: systemConfiguration (line 1616) -zh Duplicate key: noFiles (line 1617) -zh Duplicate key: noFilesDesc (line 1618) -zh Duplicate key: addFile (line 1619) -zh Duplicate key: clearAll (line 1620) -zh Duplicate key: uploading (line 1621) -zh Duplicate key: statusIndexing (line 1622) -zh Duplicate key: statusReady (line 1623) -zh Duplicate key: ragSettings (line 1626) -zh Duplicate key: enableRerank (line 1627) -zh Duplicate key: enableRerankDesc (line 1628) -zh Duplicate key: selectRerankModel (line 1629) -zh Duplicate key: selectModelPlaceholder (line 1630) -zh Duplicate key: headerModelSelection (line 1632) -zh Duplicate key: headerHyperparams (line 1633) -zh Duplicate key: headerIndexing (line 1634) -zh Duplicate key: headerRetrieval (line 1635) -zh Duplicate key: btnManageModels (line 1636) -zh Duplicate key: lblLLM (line 1638) -zh Duplicate key: lblEmbedding (line 1639) -zh Duplicate key: lblRerankRef (line 1640) -zh Duplicate key: lblTemperature (line 1641) -zh Duplicate key: lblMaxTokens (line 1642) -zh Duplicate key: lblChunkSize (line 1643) -zh Duplicate key: lblChunkOverlap (line 1644) -zh Duplicate key: lblTopK (line 1645) -zh Duplicate key: lblRerank (line 1646) -zh Duplicate key: idxModalTitle (line 1648) -zh Duplicate key: idxDesc (line 1649) -zh Duplicate key: idxFiles (line 1650) -zh Duplicate key: idxMethod (line 1651) -zh Duplicate key: idxEmbeddingModel (line 1652) -zh Duplicate key: idxStart (line 1653) -zh Duplicate key: idxCancel (line 1654) -zh Duplicate key: idxAuto (line 1655) -zh Duplicate key: idxCustom (line 1656) -zh Duplicate key: mmTitle (line 1658) -zh Duplicate key: mmAddBtn (line 1659) -zh Duplicate key: mmEdit (line 1660) -zh Duplicate key: mmDelete (line 1661) -zh Duplicate key: mmEmpty (line 1662) -zh Duplicate key: mmFormName (line 1663) -zh Duplicate key: mmFormProvider (line 1664) -zh Duplicate key: mmFormModelId (line 1665) -zh Duplicate key: mmFormBaseUrl (line 1666) -zh Duplicate key: mmFormType (line 1667) -zh Duplicate key: mmFormVision (line 1668) -zh Duplicate key: mmFormDimensions (line 1669) -zh Duplicate key: mmFormDimensionsHelp (line 1670) -zh Duplicate key: mmSave (line 1671) -zh Duplicate key: mmCancel (line 1672) -zh Duplicate key: mmErrorNotAuthenticated (line 1673) -zh Duplicate key: mmErrorTitle (line 1674) -zh Duplicate key: modelEnabled (line 1675) -zh Duplicate key: modelDisabled (line 1676) -zh Duplicate key: confirmChangeEmbeddingModel (line 1677) -zh Duplicate key: embeddingModelWarning (line 1678) -zh Duplicate key: sourcePreview (line 1679) -zh Duplicate key: matchScore (line 1680) -zh Duplicate key: copyContent (line 1681) -zh Duplicate key: copySuccess (line 1682) -zh Duplicate key: selectLLMModel (line 1685) -zh Duplicate key: selectEmbeddingModel (line 1686) -zh Duplicate key: defaultForUploads (line 1687) -zh Duplicate key: noRerankModel (line 1688) -zh Duplicate key: vectorSimilarityThreshold (line 1689) -zh Duplicate key: rerankSimilarityThreshold (line 1690) -zh Duplicate key: filterLowResults (line 1691) -zh Duplicate key: noteCreatedSuccess (line 1692) -zh Duplicate key: noteCreatedFailed (line 1693) -zh Duplicate key: fullTextSearch (line 1694) -zh Duplicate key: hybridVectorWeight (line 1695) -zh Duplicate key: hybridVectorWeightDesc (line 1696) -zh Duplicate key: lblQueryExpansion (line 1697) -zh Duplicate key: lblHyDE (line 1698) -zh Duplicate key: lblQueryExpansionDesc (line 1699) -zh Duplicate key: lblHyDEDesc (line 1700) -zh Duplicate key: apiKeyValidationFailed (line 1702) -zh Duplicate key: keepOriginalKey (line 1703) -zh Duplicate key: leaveEmptyNoChange (line 1704) -zh Duplicate key: mmFormApiKey (line 1705) -zh Duplicate key: mmFormApiKeyPlaceholder (line 1706) -zh Duplicate key: reconfigureFile (line 1709) -zh Duplicate key: modifySettings (line 1710) -zh Duplicate key: filesCount (line 1711) -zh Duplicate key: allFilesIndexed (line 1712) -zh Duplicate key: noEmbeddingModels (line 1713) -zh Duplicate key: reconfigure (line 1714) -zh Duplicate key: refresh (line 1715) -zh Duplicate key: settings (line 1716) -zh Duplicate key: needLogin (line 1717) -zh Duplicate key: citationSources (line 1718) -zh Duplicate key: chunkNumber (line 1719) -zh Duplicate key: getUserListFailed (line 1720) -zh Duplicate key: usernamePasswordRequired (line 1721) -zh Duplicate key: passwordMinLength (line 1722) -zh Duplicate key: userCreatedSuccess (line 1723) -zh Duplicate key: createUserFailed (line 1724) -zh Duplicate key: userPromotedToAdmin (line 1725) -zh Duplicate key: userDemotedFromAdmin (line 1726) -zh Duplicate key: updateUserFailed (line 1727) -zh Duplicate key: confirmDeleteUser (line 1728) -zh Duplicate key: deleteUser (line 1729) -zh Duplicate key: deleteUserFailed (line 1730) -zh Duplicate key: userDeletedSuccessfully (line 1731) -zh Duplicate key: makeUserAdmin (line 1732) -zh Duplicate key: makeUserRegular (line 1733) -zh Duplicate key: loading (line 1734) -zh Duplicate key: noUsers (line 1735) -zh Duplicate key: aiAssistant (line 1738) -zh Duplicate key: polishContent (line 1739) -zh Duplicate key: expandContent (line 1740) -zh Duplicate key: summarizeContent (line 1741) -zh Duplicate key: translateToEnglish (line 1742) -zh Duplicate key: fixGrammar (line 1743) -zh Duplicate key: aiCommandInstructPolish (line 1744) -zh Duplicate key: aiCommandInstructExpand (line 1745) -zh Duplicate key: aiCommandInstructSummarize (line 1746) -zh Duplicate key: aiCommandInstructTranslateToEn (line 1747) -zh Duplicate key: aiCommandInstructFixGrammar (line 1748) -zh Duplicate key: aiCommandsPreset (line 1749) -zh Duplicate key: aiCommandsCustom (line 1750) -zh Duplicate key: aiCommandsCustomPlaceholder (line 1751) -zh Duplicate key: aiCommandsReferenceContext (line 1752) -zh Duplicate key: aiCommandsStartGeneration (line 1753) -zh Duplicate key: aiCommandsResult (line 1754) -zh Duplicate key: aiCommandsGenerating (line 1755) -zh Duplicate key: aiCommandsApplyResult (line 1756) -zh Duplicate key: aiCommandsGoBack (line 1757) -zh Duplicate key: aiCommandsReset (line 1758) -zh Duplicate key: aiCommandsModalPreset (line 1759) -zh Duplicate key: aiCommandsModalCustom (line 1760) -zh Duplicate key: aiCommandsModalCustomPlaceholder (line 1761) -zh Duplicate key: aiCommandsModalBasedOnSelection (line 1762) -zh Duplicate key: aiCommandsModalResult (line 1763) -zh Duplicate key: aiCommandsModalApply (line 1764) -zh Duplicate key: fillAllFields (line 1767) -zh Duplicate key: passwordMismatch (line 1768) -zh Duplicate key: newPasswordMinLength (line 1769) -zh Duplicate key: changePasswordFailed (line 1770) -zh Duplicate key: changePasswordTitle (line 1771) -zh Duplicate key: changing (line 1772) -zh Duplicate key: searchResults (line 1773) -zh Duplicate key: visionModelSettings (line 1776) -zh Duplicate key: defaultVisionModel (line 1777) -zh Duplicate key: loadVisionModelFailed (line 1778) -zh Duplicate key: loadFailed (line 1779) -zh Duplicate key: saveVisionModelFailed (line 1780) -zh Duplicate key: noVisionModels (line 1781) -zh Duplicate key: selectVisionModel (line 1782) -zh Duplicate key: visionModelHelp (line 1783) -zh Duplicate key: mmErrorNameRequired (line 1784) -zh Duplicate key: mmErrorModelIdRequired (line 1785) -zh Duplicate key: mmErrorBaseUrlRequired (line 1786) -zh Duplicate key: mmRequiredAsterisk (line 1787) -zh Duplicate key: typeLLM (line 1789) -zh Duplicate key: typeEmbedding (line 1790) -zh Duplicate key: typeRerank (line 1791) -zh Duplicate key: typeVision (line 1792) -zh Duplicate key: welcome (line 1794) -zh Duplicate key: placeholderWithFiles (line 1795) -zh Duplicate key: placeholderEmpty (line 1796) -zh Duplicate key: analyzing (line 1797) -zh Duplicate key: errorGeneric (line 1798) -zh Duplicate key: errorLabel (line 1799) -zh Duplicate key: errorNoModel (line 1800) -zh Duplicate key: aiDisclaimer (line 1801) -zh Duplicate key: confirmClear (line 1802) -zh Duplicate key: removeFile (line 1803) -zh Duplicate key: apiError (line 1804) -zh Duplicate key: geminiError (line 1805) -zh Duplicate key: processedButNoText (line 1806) -zh Duplicate key: unitByte (line 1807) -zh Duplicate key: readingFailed (line 1808) -zh Duplicate key: copy (line 1810) -zh Duplicate key: copied (line 1811) -zh Duplicate key: logout (line 1814) -zh Duplicate key: changePassword (line 1815) -zh Duplicate key: userManagement (line 1816) -zh Duplicate key: userList (line 1817) -zh Duplicate key: addUser (line 1818) -zh Duplicate key: username (line 1819) -zh Duplicate key: password (line 1820) -zh Duplicate key: confirmPassword (line 1821) -zh Duplicate key: currentPassword (line 1822) -zh Duplicate key: newPassword (line 1823) -zh Duplicate key: createUser (line 1824) -zh Duplicate key: admin (line 1825) -zh Duplicate key: user (line 1826) -zh Duplicate key: adminUser (line 1827) -zh Duplicate key: confirmChange (line 1828) -zh Duplicate key: changeUserPassword (line 1829) -zh Duplicate key: enterNewPassword (line 1830) -zh Duplicate key: createdAt (line 1831) -zh Duplicate key: newChat (line 1832) -zh Duplicate key: kbManagement (line 1835) -zh Duplicate key: kbManagementDesc (line 1836) -zh Duplicate key: searchPlaceholder (line 1837) -zh Duplicate key: allGroups (line 1838) -zh Duplicate key: allStatus (line 1839) -zh Duplicate key: statusReadyFragment (line 1840) -zh Duplicate key: statusFailedFragment (line 1841) -zh Duplicate key: statusIndexingFragment (line 1842) -zh Duplicate key: uploadFile (line 1843) -zh Duplicate key: fileName (line 1844) -zh Duplicate key: size (line 1845) -zh Duplicate key: status (line 1846) -zh Duplicate key: groups (line 1847) -zh Duplicate key: actions (line 1848) -zh Duplicate key: groupsActions (line 1849) -zh Duplicate key: noFilesFound (line 1850) -zh Duplicate key: showingRange (line 1851) -zh Duplicate key: confirmDeleteFile (line 1852) -zh Duplicate key: fileDeleted (line 1853) -zh Duplicate key: deleteFailed (line 1854) -zh Duplicate key: fileAddedToGroup (line 1855) -zh Duplicate key: failedToAddToGroup (line 1856) -zh Duplicate key: fileRemovedFromGroup (line 1857) -zh Duplicate key: failedToRemoveFromGroup (line 1858) -zh Duplicate key: confirmClearKB (line 1859) -zh Duplicate key: kbCleared (line 1860) -zh Duplicate key: clearFailed (line 1861) -zh Duplicate key: actionFailed (line 1862) -zh Duplicate key: groupCreated (line 1863) -zh Duplicate key: groupUpdated (line 1864) -zh Duplicate key: groupDeleted (line 1865) -zh Duplicate key: groupManagement (line 1866) -zh Duplicate key: loginRequired (line 1867) -zh Duplicate key: uploadErrors (line 1868) -zh Duplicate key: uploadWarning (line 1869) -zh Duplicate key: uploadFailed (line 1870) -zh Duplicate key: preview (line 1871) -zh Duplicate key: addGroup (line 1872) -zh Duplicate key: delete (line 1873) -zh Duplicate key: retry (line 1874) -zh Duplicate key: retrying (line 1875) -zh Duplicate key: retrySuccess (line 1876) -zh Duplicate key: retryFailed (line 1877) -zh Duplicate key: chunkInfo (line 1878) -zh Duplicate key: totalChunks (line 1879) -zh Duplicate key: chunkIndex (line 1880) -zh Duplicate key: contentLength (line 1881) -zh Duplicate key: position (line 1882) -zh Duplicate key: reconfigureTitle (line 1885) -zh Duplicate key: reconfigureDesc (line 1886) -zh Duplicate key: indexingConfigTitle (line 1887) -zh Duplicate key: indexingConfigDesc (line 1888) -zh Duplicate key: pendingFiles (line 1889) -zh Duplicate key: processingMode (line 1890) -zh Duplicate key: analyzingFile (line 1891) -zh Duplicate key: recommendationReason (line 1892) -zh Duplicate key: fastMode (line 1893) -zh Duplicate key: fastModeDesc (line 1894) -zh Duplicate key: preciseMode (line 1895) -zh Duplicate key: preciseModeDesc (line 1896) -zh Duplicate key: fastModeFeatures (line 1897) -zh Duplicate key: fastFeature1 (line 1898) -zh Duplicate key: fastFeature2 (line 1899) -zh Duplicate key: fastFeature3 (line 1900) -zh Duplicate key: fastFeature4 (line 1901) -zh Duplicate key: fastFeature5 (line 1902) -zh Duplicate key: preciseModeFeatures (line 1903) -zh Duplicate key: preciseFeature1 (line 1904) -zh Duplicate key: preciseFeature2 (line 1905) -zh Duplicate key: preciseFeature3 (line 1906) -zh Duplicate key: preciseFeature4 (line 1907) -zh Duplicate key: preciseFeature5 (line 1908) -zh Duplicate key: preciseFeature6 (line 1909) -zh Duplicate key: embeddingModel (line 1910) -zh Duplicate key: pleaseSelect (line 1911) -zh Duplicate key: pleaseSelectKnowledgeGroupFirst (line 1912) -zh Duplicate key: selectUnassignGroupWarning (line 1913) -zh Duplicate key: chunkConfig (line 1914) -zh Duplicate key: chunkSize (line 1915) -zh Duplicate key: min (line 1916) -zh Duplicate key: max (line 1917) -zh Duplicate key: chunkOverlap (line 1918) -zh Duplicate key: modelLimitsInfo (line 1919) -zh Duplicate key: model (line 1920) -zh Duplicate key: maxChunkSize (line 1921) -zh Duplicate key: maxOverlapSize (line 1922) -zh Duplicate key: maxBatchSize (line 1923) -zh Duplicate key: envLimitWeaker (line 1924) -zh Duplicate key: optimizationTips (line 1925) -zh Duplicate key: tipChunkTooLarge (line 1926) -zh Duplicate key: tipOverlapSmall (line 1927) -zh Duplicate key: tipMaxValues (line 1928) -zh Duplicate key: tipPreciseCost (line 1929) -zh Duplicate key: selectEmbeddingFirst (line 1930) -zh Duplicate key: confirmPreciseCost (line 1931) -zh Duplicate key: startProcessing (line 1932) -zh Duplicate key: notebooks (line 1935) -zh Duplicate key: notebooksDesc (line 1936) -zh Duplicate key: createNotebook (line 1937) -zh Duplicate key: chatWithNotebook (line 1938) -zh Duplicate key: editNotebook (line 1939) -zh Duplicate key: deleteNotebook (line 1940) -zh Duplicate key: noDescription (line 1941) -zh Duplicate key: hasIntro (line 1942) -zh Duplicate key: noIntro (line 1943) -zh Duplicate key: noNotebooks (line 1944) -zh Duplicate key: createFailed (line 1945) -zh Duplicate key: confirmDeleteNotebook (line 1946) -zh Duplicate key: errorFileTooLarge (line 1949) -zh Duplicate key: noFilesYet (line 1950) -zh Duplicate key: createNotebookTitle (line 1953) -zh Duplicate key: editNotebookTitle (line 1954) -zh Duplicate key: createFailedRetry (line 1955) -zh Duplicate key: updateFailedRetry (line 1956) -zh Duplicate key: name (line 1957) -zh Duplicate key: nameHelp (line 1958) -zh Duplicate key: namePlaceholder (line 1959) -zh Duplicate key: shortDescription (line 1960) -zh Duplicate key: descPlaceholder (line 1961) -zh Duplicate key: detailedIntro (line 1962) -zh Duplicate key: introPlaceholder (line 1963) -zh Duplicate key: introHelp (line 1964) -zh Duplicate key: creating (line 1965) -zh Duplicate key: createNow (line 1966) -zh Duplicate key: saving (line 1967) -zh Duplicate key: save (line 1968) -zh Duplicate key: chatTitle (line 1971) -zh Duplicate key: chatDesc (line 1972) -zh Duplicate key: viewHistory (line 1973) -zh Duplicate key: saveSettingsFailed (line 1974) -zh Duplicate key: loginToUpload (line 1975) -zh Duplicate key: fileSizeLimitExceeded (line 1976) -zh Duplicate key: unsupportedFileType (line 1977) -zh Duplicate key: readFailed (line 1978) -zh Duplicate key: loadHistoryFailed (line 1979) -zh Duplicate key: loadingUserData (line 1980) -zh Duplicate key: errorMessage (line 1981) -zh Duplicate key: welcomeMessage (line 1982) -zh Duplicate key: selectKnowledgeGroup (line 1983) -zh Duplicate key: allKnowledgeGroups (line 1984) -zh Duplicate key: unknownGroup (line 1985) -zh Duplicate key: selectedGroupsCount (line 1986) -zh Duplicate key: generalSettings (line 1989) -zh Duplicate key: modelManagement (line 1990) -zh Duplicate key: languageSettings (line 1991) -zh Duplicate key: passwordChangeSuccess (line 1992) -zh Duplicate key: passwordChangeFailed (line 1993) -zh Duplicate key: create (line 1994) -zh Duplicate key: validationFailedMsg (line 1995) -zh Duplicate key: navChat (line 1999) -zh Duplicate key: navCoach (line 2000) -zh Duplicate key: navKnowledge (line 2001) -zh Duplicate key: navKnowledgeGroups (line 2002) -zh Duplicate key: navCrawler (line 2003) -zh Duplicate key: expandMenu (line 2004) -zh Duplicate key: switchLanguage (line 2005) -zh Duplicate key: selectKnowledgeGroups (line 2008) -zh Duplicate key: searchGroupsPlaceholder (line 2009) -zh Duplicate key: done (line 2010) -zh Duplicate key: all (line 2011) -zh Duplicate key: noGroupsFound (line 2012) -zh Duplicate key: noGroups (line 2013) -zh Duplicate key: autoRefresh (line 2016) -zh Duplicate key: refreshInterval (line 2017) -zh Duplicate key: errorRenderFlowchart (line 2020) -zh Duplicate key: errorLoadData (line 2021) -zh Duplicate key: confirmUnsupportedFile (line 2022) -zh Duplicate key: errorReadFile (line 2023) -zh Duplicate key: successUploadFile (line 2024) -zh Duplicate key: errorUploadFile (line 2025) -zh Duplicate key: errorProcessFile (line 2026) -zh Duplicate key: errorTitleContentRequired (line 2027) -zh Duplicate key: successNoteUpdated (line 2028) -zh Duplicate key: successNoteCreated (line 2029) -zh Duplicate key: errorSaveFailed (line 2030) -zh Duplicate key: confirmDeleteNote (line 2031) -zh Duplicate key: successNoteDeleted (line 2032) -zh Duplicate key: confirmRemoveFileFromGroup (line 2033) -zh Duplicate key: editNote (line 2034) -zh Duplicate key: newNote (line 2035) -zh Duplicate key: togglePreviewOpen (line 2036) -zh Duplicate key: togglePreviewClose (line 2037) -zh Duplicate key: noteTitlePlaceholder (line 2038) -zh Duplicate key: noteContentPlaceholder (line 2039) -zh Duplicate key: markdownPreviewArea (line 2040) -zh Duplicate key: back (line 2041) -zh Duplicate key: chatWithGroup (line 2042) -zh Duplicate key: chatWithFile (line 2043) -zh Duplicate key: filesCountLabel (line 2044) -zh Duplicate key: notesCountLabel (line 2045) -zh Duplicate key: indexIntoKB (line 2046) -zh Duplicate key: noFilesOrNotes (line 2047) -zh Duplicate key: importFolder (line 2048) -zh Duplicate key: createPDFNote (line 2051) -zh Duplicate key: screenshotPreview (line 2052) -zh Duplicate key: associateKnowledgeGroup (line 2053) -zh Duplicate key: globalNoSpecificGroup (line 2054) -zh Duplicate key: title (line 2055) -zh Duplicate key: enterNoteTitle (line 2056) -zh Duplicate key: contentOCR (line 2057) -zh Duplicate key: extractingText (line 2058) -zh Duplicate key: analyzingImage (line 2059) -zh Duplicate key: noTextExtracted (line 2060) -zh Duplicate key: saveNote (line 2061) -zh Duplicate key: page (line 2064) -zh Duplicate key: placeholderText (line 2065) -zh Duplicate key: createNewNotebook (line 2068) -zh Duplicate key: nameField (line 2069) -zh Duplicate key: required (line 2070) -zh Duplicate key: exampleResearch (line 2071) -zh Duplicate key: shortDescriptionField (line 2072) -zh Duplicate key: describePurpose (line 2073) -zh Duplicate key: detailedIntroField (line 2074) -zh Duplicate key: provideBackgroundInfo (line 2075) -zh Duplicate key: creationFailed (line 2076) -zh Duplicate key: preparingPDFConversion (line 2079) -zh Duplicate key: pleaseWait (line 2080) -zh Duplicate key: convertingPDF (line 2081) -zh Duplicate key: pdfConversionFailed (line 2082) -zh Duplicate key: pdfConversionError (line 2083) -zh Duplicate key: pdfLoadFailed (line 2084) -zh Duplicate key: pdfLoadError (line 2085) -zh Duplicate key: downloadingPDF (line 2086) -zh Duplicate key: loadingPDF (line 2087) -zh Duplicate key: zoomOut (line 2088) -zh Duplicate key: zoomIn (line 2089) -zh Duplicate key: resetZoom (line 2090) -zh Duplicate key: selectPageNumber (line 2091) -zh Duplicate key: enterPageNumber (line 2092) -zh Duplicate key: exitSelectionMode (line 2093) -zh Duplicate key: clickToSelectAndNote (line 2094) -zh Duplicate key: regeneratePDF (line 2095) -zh Duplicate key: downloadPDF (line 2096) -zh Duplicate key: openInNewWindow (line 2097) -zh Duplicate key: exitFullscreen (line 2098) -zh Duplicate key: fullscreenDisplay (line 2099) -zh Duplicate key: pdfPreview (line 2100) -zh Duplicate key: converting (line 2101) -zh Duplicate key: generatePDFPreview (line 2102) -zh Duplicate key: previewNotSupported (line 2103) -zh Duplicate key: confirmRegeneratePDF (line 2106) -zh Duplicate key: pdfPreviewReady (line 2109) -zh Duplicate key: convertingInProgress (line 2110) -zh Duplicate key: conversionFailed (line 2111) -zh Duplicate key: generatePDFPreviewButton (line 2112) -zh Duplicate key: checkPDFStatusFailed (line 2115) -zh Duplicate key: requestRegenerationFailed (line 2116) -zh Duplicate key: downloadPDFFailed (line 2117) -zh Duplicate key: openPDFInNewTabFailed (line 2118) -zh Duplicate key: invalidFile (line 2121) -zh Duplicate key: incompleteFileInfo (line 2122) -zh Duplicate key: unsupportedFileFormat (line 2123) -zh Duplicate key: willUseFastMode (line 2124) -zh Duplicate key: formatNoPrecise (line 2125) -zh Duplicate key: smallFileFastOk (line 2126) -zh Duplicate key: mixedContentPreciseRecommended (line 2127) -zh Duplicate key: willIncurApiCost (line 2128) -zh Duplicate key: largeFilePreciseRecommended (line 2129) -zh Duplicate key: longProcessingTime (line 2130) -zh Duplicate key: highApiCost (line 2131) -zh Duplicate key: considerFileSplitting (line 2132) -zh Duplicate key: dragDropUploadTitle (line 2135) -zh Duplicate key: dragDropUploadDesc (line 2136) -zh Duplicate key: supportedFormats (line 2137) -zh Duplicate key: browseFiles (line 2138) -zh Duplicate key: recommendationMsg (line 2141) -zh Duplicate key: autoAdjustChunk (line 2142) -zh Duplicate key: autoAdjustOverlap (line 2143) -zh Duplicate key: autoAdjustOverlapMin (line 2144) -zh Duplicate key: loadLimitsFailed (line 2145) -zh Duplicate key: maxValueMsg (line 2146) -zh Duplicate key: overlapRatioLimit (line 2147) -zh Duplicate key: onlyAdminCanModify (line 2148) -zh Duplicate key: dragToSelect (line 2149) -zh Duplicate key: fillTargetName (line 2152) -zh Duplicate key: submitFailed (line 2153) -zh Duplicate key: importFolderTitle (line 2154) -zh Duplicate key: importFolderTip (line 2155) -zh Duplicate key: lblTargetGroup (line 2156) -zh Duplicate key: placeholderNewGroup (line 2157) -zh Duplicate key: importToCurrentGroup (line 2158) -zh Duplicate key: nextStep (line 2159) -zh Duplicate key: lblImportSource (line 2160) -zh Duplicate key: serverPath (line 2161) -zh Duplicate key: localFolder (line 2162) -zh Duplicate key: selectedFilesCount (line 2163) -zh Duplicate key: clickToSelectFolder (line 2164) -zh Duplicate key: selectFolderTip (line 2165) -zh Duplicate key: importComplete (line 2166) -zh Duplicate key: importedFromLocalFolder (line 2167) -zh Duplicate key: historyTitle (line 2170) -zh Duplicate key: confirmDeleteHistory (line 2171) -zh Duplicate key: deleteHistorySuccess (line 2172) -zh Duplicate key: deleteHistoryFailed (line 2173) -zh Duplicate key: yesterday (line 2174) -zh Duplicate key: daysAgo (line 2175) -zh Duplicate key: historyMessages (line 2176) -zh Duplicate key: noHistory (line 2177) -zh Duplicate key: noHistoryDesc (line 2178) -zh Duplicate key: loadMore (line 2179) -zh Duplicate key: loadingHistoriesFailed (line 2180) -zh Duplicate key: supportedFormatsInfo (line 2181) -zh Duplicate key: navCatalog (line 2184) -zh Duplicate key: allDocuments (line 2185) -zh Duplicate key: uncategorized (line 2186) -zh Duplicate key: categories (line 2187) -zh Duplicate key: uncategorizedFiles (line 2188) -zh Duplicate key: category (line 2189) -zh Duplicate key: statusReadyDesc (line 2190) -zh Duplicate key: statusIndexingDesc (line 2191) -zh Duplicate key: selectCategory (line 2192) -zh Duplicate key: noneUncategorized (line 2193) -zh Duplicate key: previous (line 2194) -zh Duplicate key: next (line 2195) -zh Duplicate key: editCategory (line 2196) -zh Duplicate key: createCategory (line 2197) -zh Duplicate key: categoryDesc (line 2198) -zh Duplicate key: categoryName (line 2199) -zh Duplicate key: saveChanges (line 2200) -zh Duplicate key: createCategoryBtn (line 2201) -zh Duplicate key: totalTenants (line 2204) -zh Duplicate key: systemUsers (line 2205) -zh Duplicate key: systemHealth (line 2206) -zh Duplicate key: operational (line 2207) -zh Duplicate key: orgManagement (line 2208) -zh Duplicate key: globalTenantControl (line 2209) -zh Duplicate key: newTenant (line 2210) -zh Duplicate key: tenantName (line 2211) -zh Duplicate key: domainOptional (line 2212) -zh Duplicate key: assignInitialAdmin (line 2213) -zh Duplicate key: selectUserOptional (line 2214) -zh Duplicate key: promoteToAdminWarning (line 2215) -zh Duplicate key: editOrganization (line 2216) -zh Duplicate key: createOrganization (line 2217) -zh Duplicate key: bindAdmin (line 2218) -zh Duplicate key: manageMembers (line 2219) -zh Duplicate key: currentMembers (line 2220) -zh Duplicate key: addMembers (line 2221) -zh Duplicate key: systemRestricted (line 2222) -zh Duplicate key: noUnassignedUsers (line 2223) -zh Duplicate key: enableNotebook (line 2224) -zh Duplicate key: disableNotebook (line 2225) -zh Duplicate key: featureUpdated (line 2226) -zh Duplicate key: editUserRole (line 2229) -zh Duplicate key: targetRole (line 2230) -zh Duplicate key: changeUserPassword (line 2231) -zh Duplicate key: enterNewPassword (line 2232) -zh Duplicate key: confirmDeleteUser (line 2233) -zh Duplicate key: userDeletedSuccessfully (line 2234) -zh Duplicate key: defaultBadge (line 2235) -zh Duplicate key: kbSettingsSaved (line 2238) -zh Duplicate key: failedToSaveSettings (line 2239) -zh Duplicate key: modelConfiguration (line 2240) -zh Duplicate key: defaultLLMModel (line 2241) -zh Duplicate key: selectLLM (line 2242) -zh Duplicate key: embeddingModel (line 2243) -zh Duplicate key: selectEmbedding (line 2244) -zh Duplicate key: rerankModel (line 2245) -zh Duplicate key: none (line 2246) -zh Duplicate key: indexingChunkingConfig (line 2247) -zh Duplicate key: chatHyperparameters (line 2248) -zh Duplicate key: precise (line 2249) -zh Duplicate key: creative (line 2250) -zh Duplicate key: maxResponseTokens (line 2251) -zh Duplicate key: retrievalSearchSettings (line 2252) -zh Duplicate key: enableHybridSearch (line 2253) -zh Duplicate key: hybridSearchDesc (line 2254) -zh Duplicate key: hybridWeight (line 2255) -zh Duplicate key: pureText (line 2256) -zh Duplicate key: pureVector (line 2257) -zh Duplicate key: enableQueryExpansion (line 2258) -zh Duplicate key: queryExpansionDesc (line 2259) -zh Duplicate key: enableHyDE (line 2260) -zh Duplicate key: hydeDesc (line 2261) -zh Duplicate key: enableReranking (line 2262) -zh Duplicate key: rerankingDesc (line 2263) -zh Duplicate key: importFolder (line 2266) -zh Duplicate key: newGroup (line 2267) -zh Duplicate key: noKnowledgeGroups (line 2268) -zh Duplicate key: createGroupDesc (line 2269) -zh Duplicate key: noDescriptionProvided (line 2270) -zh Duplicate key: files (line 2271) -zh Duplicate key: filterGroupFiles (line 2272) -zh Duplicate key: browseManageFiles (line 2273) -zh Duplicate key: navAgent (line 2276) -zh Duplicate key: agentTitle (line 2277) -zh Duplicate key: agentDesc (line 2278) -zh Duplicate key: searchAgent (line 2279) -zh Duplicate key: createAgent (line 2280) -zh Duplicate key: statusRunning (line 2281) -zh Duplicate key: statusStopped (line 2282) -zh Duplicate key: btnChat (line 2283) -zh Duplicate key: navPlugin (line 2286) -zh Duplicate key: pluginTitle (line 2287) -zh Duplicate key: pluginDesc (line 2288) -zh Duplicate key: searchPlugin (line 2289) -zh Duplicate key: installPlugin (line 2290) -zh Duplicate key: installedPlugin (line 2291) -zh Duplicate key: updatePlugin (line 2292) -zh Duplicate key: selectOrganization (line 2295) -zh Duplicate key: defaultTenant (line 2296) -zh Duplicate key: roleTenantAdmin (line 2297) -zh Duplicate key: roleRegularUser (line 2298) -zh Duplicate key: creatingRegularUser (line 2299) -zh Duplicate key: defaultBadge (line 2300) -zh Duplicate key: defaultSettingFailed (line 2301) -zh Duplicate key: pluginOfficial (line 2302) -zh Duplicate key: pluginCommunity (line 2303) -zh Duplicate key: pluginBy (line 2304) -zh Duplicate key: pluginConfig (line 2305) -zh Duplicate key: updatedAtPrefix (line 2306) -zh Duplicate key: plugin1Name (line 2307) -zh Duplicate key: plugin1Desc (line 2308) -zh Duplicate key: plugin2Name (line 2309) -zh Duplicate key: plugin2Desc (line 2310) -zh Duplicate key: plugin3Name (line 2311) -zh Duplicate key: plugin3Desc (line 2312) -zh Duplicate key: plugin4Name (line 2313) -zh Duplicate key: plugin4Desc (line 2314) -zh Duplicate key: plugin5Name (line 2315) -zh Duplicate key: plugin5Desc (line 2316) -zh Duplicate key: plugin6Name (line 2317) -zh Duplicate key: plugin6Desc (line 2318) -zh Duplicate key: agent1Name (line 2319) -zh Duplicate key: agent1Desc (line 2320) -zh Duplicate key: agent1Time (line 2321) -zh Duplicate key: agent2Name (line 2322) -zh Duplicate key: agent2Desc (line 2323) -zh Duplicate key: agent2Time (line 2324) -zh Duplicate key: agent3Name (line 2325) -zh Duplicate key: agent3Desc (line 2326) -zh Duplicate key: agent3Time (line 2327) -zh Duplicate key: agent4Name (line 2328) -zh Duplicate key: agent4Desc (line 2329) -zh Duplicate key: agent4Time (line 2330) -zh Duplicate key: agent5Name (line 2331) -zh Duplicate key: agent5Desc (line 2332) -zh Duplicate key: agent5Time (line 2333) -zh Duplicate key: agent6Name (line 2334) -zh Duplicate key: agent6Desc (line 2335) -zh Duplicate key: agent6Time (line 2336) -zh Duplicate key: agent7Name (line 2337) -zh Duplicate key: agent7Desc (line 2338) -zh Duplicate key: agent7Time (line 2339) -zh Duplicate key: generalSettingsSubtitle (line 2340) -zh Duplicate key: userManagementSubtitle (line 2341) -zh Duplicate key: modelManagementSubtitle (line 2342) -zh Duplicate key: kbSettingsSubtitle (line 2343) -zh Duplicate key: tenantsSubtitle (line 2344) -zh Duplicate key: allNotes (line 2346) -zh Duplicate key: filterNotesPlaceholder (line 2347) -zh Duplicate key: noteTitlePlaceholder (line 2348) -zh Duplicate key: startWritingPlaceholder (line 2349) -zh Duplicate key: previewHeader (line 2350) -zh Duplicate key: noContentToPreview (line 2351) -zh Duplicate key: hidePreview (line 2352) -zh Duplicate key: showPreview (line 2353) -zh Duplicate key: directoryLabel (line 2354) -zh Duplicate key: uncategorized (line 2355) -zh Duplicate key: enterNamePlaceholder (line 2356) -zh Duplicate key: subFolderPlaceholder (line 2357) -zh Duplicate key: categoryCreated (line 2358) -zh Duplicate key: failedToCreateCategory (line 2359) -zh Duplicate key: failedToDeleteCategory (line 2360) -zh Duplicate key: confirmDeleteCategory (line 2361) -en Duplicate key: embeddingModel (line 1449) -en Duplicate key: chunkSize (line 1471) -en Duplicate key: chunkOverlap (line 1472) -en Duplicate key: rerankSimilarityThreshold (line 1475) -en Duplicate key: importFolder (line 1490) -en Duplicate key: files (line 1495) -en Duplicate key: roleTenantAdmin (line 1521) -en Duplicate key: roleRegularUser (line 1522) -en Duplicate key: creatingRegularUser (line 1523) -en Duplicate key: defaultBadge (line 1526) -en Duplicate key: noteTitlePlaceholder (line 1574) -en Duplicate key: uncategorized (line 1581) -en Duplicate key: aiCommandsError (line 1590) -en Duplicate key: appTitle (line 1591) -en Duplicate key: loginTitle (line 1592) -en Duplicate key: loginDesc (line 1593) -en Duplicate key: loginButton (line 1594) -en Duplicate key: loginError (line 1595) -en Duplicate key: unknownError (line 1596) -en Duplicate key: usernamePlaceholder (line 1597) -en Duplicate key: passwordPlaceholder (line 1598) -en Duplicate key: registerButton (line 1599) -en Duplicate key: langZh (line 1600) -en Duplicate key: langEn (line 1601) -en Duplicate key: langJa (line 1602) -en Duplicate key: confirm (line 1603) -en Duplicate key: cancel (line 1604) -en Duplicate key: confirmTitle (line 1605) -en Duplicate key: confirmDeleteGroup (line 1606) -en Duplicate key: sidebarTitle (line 1608) -en Duplicate key: backToWorkspace (line 1609) -en Duplicate key: goToAdmin (line 1610) -en Duplicate key: sidebarDesc (line 1611) -en Duplicate key: tabFiles (line 1612) -en Duplicate key: files (line 1613) -en Duplicate key: notes (line 1614) -en Duplicate key: tabSettings (line 1615) -en Duplicate key: systemConfiguration (line 1616) -en Duplicate key: noFiles (line 1617) -en Duplicate key: noFilesDesc (line 1618) -en Duplicate key: addFile (line 1619) -en Duplicate key: clearAll (line 1620) -en Duplicate key: uploading (line 1621) -en Duplicate key: statusIndexing (line 1622) -en Duplicate key: statusReady (line 1623) -en Duplicate key: ragSettings (line 1626) -en Duplicate key: enableRerank (line 1627) -en Duplicate key: enableRerankDesc (line 1628) -en Duplicate key: selectRerankModel (line 1629) -en Duplicate key: selectModelPlaceholder (line 1630) -en Duplicate key: headerModelSelection (line 1632) -en Duplicate key: headerHyperparams (line 1633) -en Duplicate key: headerIndexing (line 1634) -en Duplicate key: headerRetrieval (line 1635) -en Duplicate key: btnManageModels (line 1636) -en Duplicate key: lblLLM (line 1638) -en Duplicate key: lblEmbedding (line 1639) -en Duplicate key: lblRerankRef (line 1640) -en Duplicate key: lblTemperature (line 1641) -en Duplicate key: lblMaxTokens (line 1642) -en Duplicate key: lblChunkSize (line 1643) -en Duplicate key: lblChunkOverlap (line 1644) -en Duplicate key: lblTopK (line 1645) -en Duplicate key: lblRerank (line 1646) -en Duplicate key: idxModalTitle (line 1648) -en Duplicate key: idxDesc (line 1649) -en Duplicate key: idxFiles (line 1650) -en Duplicate key: idxMethod (line 1651) -en Duplicate key: idxEmbeddingModel (line 1652) -en Duplicate key: idxStart (line 1653) -en Duplicate key: idxCancel (line 1654) -en Duplicate key: idxAuto (line 1655) -en Duplicate key: idxCustom (line 1656) -en Duplicate key: mmTitle (line 1658) -en Duplicate key: mmAddBtn (line 1659) -en Duplicate key: mmEdit (line 1660) -en Duplicate key: mmDelete (line 1661) -en Duplicate key: mmEmpty (line 1662) -en Duplicate key: mmFormName (line 1663) -en Duplicate key: mmFormProvider (line 1664) -en Duplicate key: mmFormModelId (line 1665) -en Duplicate key: mmFormBaseUrl (line 1666) -en Duplicate key: mmFormType (line 1667) -en Duplicate key: mmFormVision (line 1668) -en Duplicate key: mmFormDimensions (line 1669) -en Duplicate key: mmFormDimensionsHelp (line 1670) -en Duplicate key: mmSave (line 1671) -en Duplicate key: mmCancel (line 1672) -en Duplicate key: mmErrorNotAuthenticated (line 1673) -en Duplicate key: mmErrorTitle (line 1674) -en Duplicate key: modelEnabled (line 1675) -en Duplicate key: modelDisabled (line 1676) -en Duplicate key: confirmChangeEmbeddingModel (line 1677) -en Duplicate key: embeddingModelWarning (line 1678) -en Duplicate key: sourcePreview (line 1679) -en Duplicate key: matchScore (line 1680) -en Duplicate key: copyContent (line 1681) -en Duplicate key: copySuccess (line 1682) -en Duplicate key: selectLLMModel (line 1685) -en Duplicate key: selectEmbeddingModel (line 1686) -en Duplicate key: defaultForUploads (line 1687) -en Duplicate key: noRerankModel (line 1688) -en Duplicate key: vectorSimilarityThreshold (line 1689) -en Duplicate key: rerankSimilarityThreshold (line 1690) -en Duplicate key: filterLowResults (line 1691) -en Duplicate key: noteCreatedSuccess (line 1692) -en Duplicate key: noteCreatedFailed (line 1693) -en Duplicate key: fullTextSearch (line 1694) -en Duplicate key: hybridVectorWeight (line 1695) -en Duplicate key: hybridVectorWeightDesc (line 1696) -en Duplicate key: lblQueryExpansion (line 1697) -en Duplicate key: lblHyDE (line 1698) -en Duplicate key: lblQueryExpansionDesc (line 1699) -en Duplicate key: lblHyDEDesc (line 1700) -en Duplicate key: apiKeyValidationFailed (line 1702) -en Duplicate key: keepOriginalKey (line 1703) -en Duplicate key: leaveEmptyNoChange (line 1704) -en Duplicate key: mmFormApiKey (line 1705) -en Duplicate key: mmFormApiKeyPlaceholder (line 1706) -en Duplicate key: reconfigureFile (line 1709) -en Duplicate key: modifySettings (line 1710) -en Duplicate key: filesCount (line 1711) -en Duplicate key: allFilesIndexed (line 1712) -en Duplicate key: noEmbeddingModels (line 1713) -en Duplicate key: reconfigure (line 1714) -en Duplicate key: refresh (line 1715) -en Duplicate key: settings (line 1716) -en Duplicate key: needLogin (line 1717) -en Duplicate key: citationSources (line 1718) -en Duplicate key: chunkNumber (line 1719) -en Duplicate key: getUserListFailed (line 1720) -en Duplicate key: usernamePasswordRequired (line 1721) -en Duplicate key: passwordMinLength (line 1722) -en Duplicate key: userCreatedSuccess (line 1723) -en Duplicate key: createUserFailed (line 1724) -en Duplicate key: userPromotedToAdmin (line 1725) -en Duplicate key: userDemotedFromAdmin (line 1726) -en Duplicate key: updateUserFailed (line 1727) -en Duplicate key: confirmDeleteUser (line 1728) -en Duplicate key: deleteUser (line 1729) -en Duplicate key: deleteUserFailed (line 1730) -en Duplicate key: userDeletedSuccessfully (line 1731) -en Duplicate key: makeUserAdmin (line 1732) -en Duplicate key: makeUserRegular (line 1733) -en Duplicate key: loading (line 1734) -en Duplicate key: noUsers (line 1735) -en Duplicate key: aiAssistant (line 1738) -en Duplicate key: polishContent (line 1739) -en Duplicate key: expandContent (line 1740) -en Duplicate key: summarizeContent (line 1741) -en Duplicate key: translateToEnglish (line 1742) -en Duplicate key: fixGrammar (line 1743) -en Duplicate key: aiCommandInstructPolish (line 1744) -en Duplicate key: aiCommandInstructExpand (line 1745) -en Duplicate key: aiCommandInstructSummarize (line 1746) -en Duplicate key: aiCommandInstructTranslateToEn (line 1747) -en Duplicate key: aiCommandInstructFixGrammar (line 1748) -en Duplicate key: aiCommandsPreset (line 1749) -en Duplicate key: aiCommandsCustom (line 1750) -en Duplicate key: aiCommandsCustomPlaceholder (line 1751) -en Duplicate key: aiCommandsReferenceContext (line 1752) -en Duplicate key: aiCommandsStartGeneration (line 1753) -en Duplicate key: aiCommandsResult (line 1754) -en Duplicate key: aiCommandsGenerating (line 1755) -en Duplicate key: aiCommandsApplyResult (line 1756) -en Duplicate key: aiCommandsGoBack (line 1757) -en Duplicate key: aiCommandsReset (line 1758) -en Duplicate key: aiCommandsModalPreset (line 1759) -en Duplicate key: aiCommandsModalCustom (line 1760) -en Duplicate key: aiCommandsModalCustomPlaceholder (line 1761) -en Duplicate key: aiCommandsModalBasedOnSelection (line 1762) -en Duplicate key: aiCommandsModalResult (line 1763) -en Duplicate key: aiCommandsModalApply (line 1764) -en Duplicate key: fillAllFields (line 1767) -en Duplicate key: passwordMismatch (line 1768) -en Duplicate key: newPasswordMinLength (line 1769) -en Duplicate key: changePasswordFailed (line 1770) -en Duplicate key: changePasswordTitle (line 1771) -en Duplicate key: changing (line 1772) -en Duplicate key: searchResults (line 1773) -en Duplicate key: visionModelSettings (line 1776) -en Duplicate key: defaultVisionModel (line 1777) -en Duplicate key: loadVisionModelFailed (line 1778) -en Duplicate key: loadFailed (line 1779) -en Duplicate key: saveVisionModelFailed (line 1780) -en Duplicate key: noVisionModels (line 1781) -en Duplicate key: selectVisionModel (line 1782) -en Duplicate key: visionModelHelp (line 1783) -en Duplicate key: mmErrorNameRequired (line 1784) -en Duplicate key: mmErrorModelIdRequired (line 1785) -en Duplicate key: mmErrorBaseUrlRequired (line 1786) -en Duplicate key: mmRequiredAsterisk (line 1787) -en Duplicate key: typeLLM (line 1789) -en Duplicate key: typeEmbedding (line 1790) -en Duplicate key: typeRerank (line 1791) -en Duplicate key: typeVision (line 1792) -en Duplicate key: welcome (line 1794) -en Duplicate key: placeholderWithFiles (line 1795) -en Duplicate key: placeholderEmpty (line 1796) -en Duplicate key: analyzing (line 1797) -en Duplicate key: errorGeneric (line 1798) -en Duplicate key: errorLabel (line 1799) -en Duplicate key: errorNoModel (line 1800) -en Duplicate key: aiDisclaimer (line 1801) -en Duplicate key: confirmClear (line 1802) -en Duplicate key: removeFile (line 1803) -en Duplicate key: apiError (line 1804) -en Duplicate key: geminiError (line 1805) -en Duplicate key: processedButNoText (line 1806) -en Duplicate key: unitByte (line 1807) -en Duplicate key: readingFailed (line 1808) -en Duplicate key: copy (line 1810) -en Duplicate key: copied (line 1811) -en Duplicate key: logout (line 1814) -en Duplicate key: changePassword (line 1815) -en Duplicate key: userManagement (line 1816) -en Duplicate key: userList (line 1817) -en Duplicate key: addUser (line 1818) -en Duplicate key: username (line 1819) -en Duplicate key: password (line 1820) -en Duplicate key: confirmPassword (line 1821) -en Duplicate key: currentPassword (line 1822) -en Duplicate key: newPassword (line 1823) -en Duplicate key: createUser (line 1824) -en Duplicate key: admin (line 1825) -en Duplicate key: user (line 1826) -en Duplicate key: adminUser (line 1827) -en Duplicate key: confirmChange (line 1828) -en Duplicate key: changeUserPassword (line 1829) -en Duplicate key: enterNewPassword (line 1830) -en Duplicate key: createdAt (line 1831) -en Duplicate key: newChat (line 1832) -en Duplicate key: kbManagement (line 1835) -en Duplicate key: kbManagementDesc (line 1836) -en Duplicate key: searchPlaceholder (line 1837) -en Duplicate key: allGroups (line 1838) -en Duplicate key: allStatus (line 1839) -en Duplicate key: statusReadyFragment (line 1840) -en Duplicate key: statusFailedFragment (line 1841) -en Duplicate key: statusIndexingFragment (line 1842) -en Duplicate key: uploadFile (line 1843) -en Duplicate key: fileName (line 1844) -en Duplicate key: size (line 1845) -en Duplicate key: status (line 1846) -en Duplicate key: groups (line 1847) -en Duplicate key: actions (line 1848) -en Duplicate key: groupsActions (line 1849) -en Duplicate key: noFilesFound (line 1850) -en Duplicate key: showingRange (line 1851) -en Duplicate key: confirmDeleteFile (line 1852) -en Duplicate key: fileDeleted (line 1853) -en Duplicate key: deleteFailed (line 1854) -en Duplicate key: fileAddedToGroup (line 1855) -en Duplicate key: failedToAddToGroup (line 1856) -en Duplicate key: fileRemovedFromGroup (line 1857) -en Duplicate key: failedToRemoveFromGroup (line 1858) -en Duplicate key: confirmClearKB (line 1859) -en Duplicate key: kbCleared (line 1860) -en Duplicate key: clearFailed (line 1861) -en Duplicate key: actionFailed (line 1862) -en Duplicate key: groupCreated (line 1863) -en Duplicate key: groupUpdated (line 1864) -en Duplicate key: groupDeleted (line 1865) -en Duplicate key: groupManagement (line 1866) -en Duplicate key: loginRequired (line 1867) -en Duplicate key: uploadErrors (line 1868) -en Duplicate key: uploadWarning (line 1869) -en Duplicate key: uploadFailed (line 1870) -en Duplicate key: preview (line 1871) -en Duplicate key: addGroup (line 1872) -en Duplicate key: delete (line 1873) -en Duplicate key: retry (line 1874) -en Duplicate key: retrying (line 1875) -en Duplicate key: retrySuccess (line 1876) -en Duplicate key: retryFailed (line 1877) -en Duplicate key: chunkInfo (line 1878) -en Duplicate key: totalChunks (line 1879) -en Duplicate key: chunkIndex (line 1880) -en Duplicate key: contentLength (line 1881) -en Duplicate key: position (line 1882) -en Duplicate key: reconfigureTitle (line 1885) -en Duplicate key: reconfigureDesc (line 1886) -en Duplicate key: indexingConfigTitle (line 1887) -en Duplicate key: indexingConfigDesc (line 1888) -en Duplicate key: pendingFiles (line 1889) -en Duplicate key: processingMode (line 1890) -en Duplicate key: analyzingFile (line 1891) -en Duplicate key: recommendationReason (line 1892) -en Duplicate key: fastMode (line 1893) -en Duplicate key: fastModeDesc (line 1894) -en Duplicate key: preciseMode (line 1895) -en Duplicate key: preciseModeDesc (line 1896) -en Duplicate key: fastModeFeatures (line 1897) -en Duplicate key: fastFeature1 (line 1898) -en Duplicate key: fastFeature2 (line 1899) -en Duplicate key: fastFeature3 (line 1900) -en Duplicate key: fastFeature4 (line 1901) -en Duplicate key: fastFeature5 (line 1902) -en Duplicate key: preciseModeFeatures (line 1903) -en Duplicate key: preciseFeature1 (line 1904) -en Duplicate key: preciseFeature2 (line 1905) -en Duplicate key: preciseFeature3 (line 1906) -en Duplicate key: preciseFeature4 (line 1907) -en Duplicate key: preciseFeature5 (line 1908) -en Duplicate key: preciseFeature6 (line 1909) -en Duplicate key: embeddingModel (line 1910) -en Duplicate key: pleaseSelect (line 1911) -en Duplicate key: pleaseSelectKnowledgeGroupFirst (line 1912) -en Duplicate key: selectUnassignGroupWarning (line 1913) -en Duplicate key: chunkConfig (line 1914) -en Duplicate key: chunkSize (line 1915) -en Duplicate key: min (line 1916) -en Duplicate key: max (line 1917) -en Duplicate key: chunkOverlap (line 1918) -en Duplicate key: modelLimitsInfo (line 1919) -en Duplicate key: model (line 1920) -en Duplicate key: maxChunkSize (line 1921) -en Duplicate key: maxOverlapSize (line 1922) -en Duplicate key: maxBatchSize (line 1923) -en Duplicate key: envLimitWeaker (line 1924) -en Duplicate key: optimizationTips (line 1925) -en Duplicate key: tipChunkTooLarge (line 1926) -en Duplicate key: tipOverlapSmall (line 1927) -en Duplicate key: tipMaxValues (line 1928) -en Duplicate key: tipPreciseCost (line 1929) -en Duplicate key: selectEmbeddingFirst (line 1930) -en Duplicate key: confirmPreciseCost (line 1931) -en Duplicate key: startProcessing (line 1932) -en Duplicate key: notebooks (line 1935) -en Duplicate key: notebooksDesc (line 1936) -en Duplicate key: createNotebook (line 1937) -en Duplicate key: chatWithNotebook (line 1938) -en Duplicate key: editNotebook (line 1939) -en Duplicate key: deleteNotebook (line 1940) -en Duplicate key: noDescription (line 1941) -en Duplicate key: hasIntro (line 1942) -en Duplicate key: noIntro (line 1943) -en Duplicate key: noNotebooks (line 1944) -en Duplicate key: createFailed (line 1945) -en Duplicate key: confirmDeleteNotebook (line 1946) -en Duplicate key: errorFileTooLarge (line 1949) -en Duplicate key: noFilesYet (line 1950) -en Duplicate key: createNotebookTitle (line 1953) -en Duplicate key: editNotebookTitle (line 1954) -en Duplicate key: createFailedRetry (line 1955) -en Duplicate key: updateFailedRetry (line 1956) -en Duplicate key: name (line 1957) -en Duplicate key: nameHelp (line 1958) -en Duplicate key: namePlaceholder (line 1959) -en Duplicate key: shortDescription (line 1960) -en Duplicate key: descPlaceholder (line 1961) -en Duplicate key: detailedIntro (line 1962) -en Duplicate key: introPlaceholder (line 1963) -en Duplicate key: introHelp (line 1964) -en Duplicate key: creating (line 1965) -en Duplicate key: createNow (line 1966) -en Duplicate key: saving (line 1967) -en Duplicate key: save (line 1968) -en Duplicate key: chatTitle (line 1971) -en Duplicate key: chatDesc (line 1972) -en Duplicate key: viewHistory (line 1973) -en Duplicate key: saveSettingsFailed (line 1974) -en Duplicate key: loginToUpload (line 1975) -en Duplicate key: fileSizeLimitExceeded (line 1976) -en Duplicate key: unsupportedFileType (line 1977) -en Duplicate key: readFailed (line 1978) -en Duplicate key: loadHistoryFailed (line 1979) -en Duplicate key: loadingUserData (line 1980) -en Duplicate key: errorMessage (line 1981) -en Duplicate key: welcomeMessage (line 1982) -en Duplicate key: selectKnowledgeGroup (line 1983) -en Duplicate key: allKnowledgeGroups (line 1984) -en Duplicate key: unknownGroup (line 1985) -en Duplicate key: selectedGroupsCount (line 1986) -en Duplicate key: generalSettings (line 1989) -en Duplicate key: modelManagement (line 1990) -en Duplicate key: languageSettings (line 1991) -en Duplicate key: passwordChangeSuccess (line 1992) -en Duplicate key: passwordChangeFailed (line 1993) -en Duplicate key: create (line 1994) -en Duplicate key: validationFailedMsg (line 1995) -en Duplicate key: navChat (line 1999) -en Duplicate key: navCoach (line 2000) -en Duplicate key: navKnowledge (line 2001) -en Duplicate key: navKnowledgeGroups (line 2002) -en Duplicate key: navCrawler (line 2003) -en Duplicate key: expandMenu (line 2004) -en Duplicate key: switchLanguage (line 2005) -en Duplicate key: selectKnowledgeGroups (line 2008) -en Duplicate key: searchGroupsPlaceholder (line 2009) -en Duplicate key: done (line 2010) -en Duplicate key: all (line 2011) -en Duplicate key: noGroupsFound (line 2012) -en Duplicate key: noGroups (line 2013) -en Duplicate key: autoRefresh (line 2016) -en Duplicate key: refreshInterval (line 2017) -en Duplicate key: errorRenderFlowchart (line 2020) -en Duplicate key: errorLoadData (line 2021) -en Duplicate key: confirmUnsupportedFile (line 2022) -en Duplicate key: errorReadFile (line 2023) -en Duplicate key: successUploadFile (line 2024) -en Duplicate key: errorUploadFile (line 2025) -en Duplicate key: errorProcessFile (line 2026) -en Duplicate key: errorTitleContentRequired (line 2027) -en Duplicate key: successNoteUpdated (line 2028) -en Duplicate key: successNoteCreated (line 2029) -en Duplicate key: errorSaveFailed (line 2030) -en Duplicate key: confirmDeleteNote (line 2031) -en Duplicate key: successNoteDeleted (line 2032) -en Duplicate key: confirmRemoveFileFromGroup (line 2033) -en Duplicate key: editNote (line 2034) -en Duplicate key: newNote (line 2035) -en Duplicate key: togglePreviewOpen (line 2036) -en Duplicate key: togglePreviewClose (line 2037) -en Duplicate key: noteTitlePlaceholder (line 2038) -en Duplicate key: noteContentPlaceholder (line 2039) -en Duplicate key: markdownPreviewArea (line 2040) -en Duplicate key: back (line 2041) -en Duplicate key: chatWithGroup (line 2042) -en Duplicate key: chatWithFile (line 2043) -en Duplicate key: filesCountLabel (line 2044) -en Duplicate key: notesCountLabel (line 2045) -en Duplicate key: indexIntoKB (line 2046) -en Duplicate key: noFilesOrNotes (line 2047) -en Duplicate key: importFolder (line 2048) -en Duplicate key: createPDFNote (line 2051) -en Duplicate key: screenshotPreview (line 2052) -en Duplicate key: associateKnowledgeGroup (line 2053) -en Duplicate key: globalNoSpecificGroup (line 2054) -en Duplicate key: title (line 2055) -en Duplicate key: enterNoteTitle (line 2056) -en Duplicate key: contentOCR (line 2057) -en Duplicate key: extractingText (line 2058) -en Duplicate key: analyzingImage (line 2059) -en Duplicate key: noTextExtracted (line 2060) -en Duplicate key: saveNote (line 2061) -en Duplicate key: page (line 2064) -en Duplicate key: placeholderText (line 2065) -en Duplicate key: createNewNotebook (line 2068) -en Duplicate key: nameField (line 2069) -en Duplicate key: required (line 2070) -en Duplicate key: exampleResearch (line 2071) -en Duplicate key: shortDescriptionField (line 2072) -en Duplicate key: describePurpose (line 2073) -en Duplicate key: detailedIntroField (line 2074) -en Duplicate key: provideBackgroundInfo (line 2075) -en Duplicate key: creationFailed (line 2076) -en Duplicate key: preparingPDFConversion (line 2079) -en Duplicate key: pleaseWait (line 2080) -en Duplicate key: convertingPDF (line 2081) -en Duplicate key: pdfConversionFailed (line 2082) -en Duplicate key: pdfConversionError (line 2083) -en Duplicate key: pdfLoadFailed (line 2084) -en Duplicate key: pdfLoadError (line 2085) -en Duplicate key: downloadingPDF (line 2086) -en Duplicate key: loadingPDF (line 2087) -en Duplicate key: zoomOut (line 2088) -en Duplicate key: zoomIn (line 2089) -en Duplicate key: resetZoom (line 2090) -en Duplicate key: selectPageNumber (line 2091) -en Duplicate key: enterPageNumber (line 2092) -en Duplicate key: exitSelectionMode (line 2093) -en Duplicate key: clickToSelectAndNote (line 2094) -en Duplicate key: regeneratePDF (line 2095) -en Duplicate key: downloadPDF (line 2096) -en Duplicate key: openInNewWindow (line 2097) -en Duplicate key: exitFullscreen (line 2098) -en Duplicate key: fullscreenDisplay (line 2099) -en Duplicate key: pdfPreview (line 2100) -en Duplicate key: converting (line 2101) -en Duplicate key: generatePDFPreview (line 2102) -en Duplicate key: previewNotSupported (line 2103) -en Duplicate key: confirmRegeneratePDF (line 2106) -en Duplicate key: pdfPreviewReady (line 2109) -en Duplicate key: convertingInProgress (line 2110) -en Duplicate key: conversionFailed (line 2111) -en Duplicate key: generatePDFPreviewButton (line 2112) -en Duplicate key: checkPDFStatusFailed (line 2115) -en Duplicate key: requestRegenerationFailed (line 2116) -en Duplicate key: downloadPDFFailed (line 2117) -en Duplicate key: openPDFInNewTabFailed (line 2118) -en Duplicate key: invalidFile (line 2121) -en Duplicate key: incompleteFileInfo (line 2122) -en Duplicate key: unsupportedFileFormat (line 2123) -en Duplicate key: willUseFastMode (line 2124) -en Duplicate key: formatNoPrecise (line 2125) -en Duplicate key: smallFileFastOk (line 2126) -en Duplicate key: mixedContentPreciseRecommended (line 2127) -en Duplicate key: willIncurApiCost (line 2128) -en Duplicate key: largeFilePreciseRecommended (line 2129) -en Duplicate key: longProcessingTime (line 2130) -en Duplicate key: highApiCost (line 2131) -en Duplicate key: considerFileSplitting (line 2132) -en Duplicate key: dragDropUploadTitle (line 2135) -en Duplicate key: dragDropUploadDesc (line 2136) -en Duplicate key: supportedFormats (line 2137) -en Duplicate key: browseFiles (line 2138) -en Duplicate key: recommendationMsg (line 2141) -en Duplicate key: autoAdjustChunk (line 2142) -en Duplicate key: autoAdjustOverlap (line 2143) -en Duplicate key: autoAdjustOverlapMin (line 2144) -en Duplicate key: loadLimitsFailed (line 2145) -en Duplicate key: maxValueMsg (line 2146) -en Duplicate key: overlapRatioLimit (line 2147) -en Duplicate key: onlyAdminCanModify (line 2148) -en Duplicate key: dragToSelect (line 2149) -en Duplicate key: fillTargetName (line 2152) -en Duplicate key: submitFailed (line 2153) -en Duplicate key: importFolderTitle (line 2154) -en Duplicate key: importFolderTip (line 2155) -en Duplicate key: lblTargetGroup (line 2156) -en Duplicate key: placeholderNewGroup (line 2157) -en Duplicate key: importToCurrentGroup (line 2158) -en Duplicate key: nextStep (line 2159) -en Duplicate key: lblImportSource (line 2160) -en Duplicate key: serverPath (line 2161) -en Duplicate key: localFolder (line 2162) -en Duplicate key: selectedFilesCount (line 2163) -en Duplicate key: clickToSelectFolder (line 2164) -en Duplicate key: selectFolderTip (line 2165) -en Duplicate key: importComplete (line 2166) -en Duplicate key: importedFromLocalFolder (line 2167) -en Duplicate key: historyTitle (line 2170) -en Duplicate key: confirmDeleteHistory (line 2171) -en Duplicate key: deleteHistorySuccess (line 2172) -en Duplicate key: deleteHistoryFailed (line 2173) -en Duplicate key: yesterday (line 2174) -en Duplicate key: daysAgo (line 2175) -en Duplicate key: historyMessages (line 2176) -en Duplicate key: noHistory (line 2177) -en Duplicate key: noHistoryDesc (line 2178) -en Duplicate key: loadMore (line 2179) -en Duplicate key: loadingHistoriesFailed (line 2180) -en Duplicate key: supportedFormatsInfo (line 2181) -en Duplicate key: navCatalog (line 2184) -en Duplicate key: allDocuments (line 2185) -en Duplicate key: uncategorized (line 2186) -en Duplicate key: categories (line 2187) -en Duplicate key: uncategorizedFiles (line 2188) -en Duplicate key: category (line 2189) -en Duplicate key: statusReadyDesc (line 2190) -en Duplicate key: statusIndexingDesc (line 2191) -en Duplicate key: selectCategory (line 2192) -en Duplicate key: noneUncategorized (line 2193) -en Duplicate key: previous (line 2194) -en Duplicate key: next (line 2195) -en Duplicate key: editCategory (line 2196) -en Duplicate key: createCategory (line 2197) -en Duplicate key: categoryDesc (line 2198) -en Duplicate key: categoryName (line 2199) -en Duplicate key: saveChanges (line 2200) -en Duplicate key: createCategoryBtn (line 2201) -en Duplicate key: totalTenants (line 2204) -en Duplicate key: systemUsers (line 2205) -en Duplicate key: systemHealth (line 2206) -en Duplicate key: operational (line 2207) -en Duplicate key: orgManagement (line 2208) -en Duplicate key: globalTenantControl (line 2209) -en Duplicate key: newTenant (line 2210) -en Duplicate key: tenantName (line 2211) -en Duplicate key: domainOptional (line 2212) -en Duplicate key: assignInitialAdmin (line 2213) -en Duplicate key: selectUserOptional (line 2214) -en Duplicate key: promoteToAdminWarning (line 2215) -en Duplicate key: editOrganization (line 2216) -en Duplicate key: createOrganization (line 2217) -en Duplicate key: bindAdmin (line 2218) -en Duplicate key: manageMembers (line 2219) -en Duplicate key: currentMembers (line 2220) -en Duplicate key: addMembers (line 2221) -en Duplicate key: systemRestricted (line 2222) -en Duplicate key: noUnassignedUsers (line 2223) -en Duplicate key: enableNotebook (line 2224) -en Duplicate key: disableNotebook (line 2225) -en Duplicate key: featureUpdated (line 2226) -en Duplicate key: editUserRole (line 2229) -en Duplicate key: targetRole (line 2230) -en Duplicate key: changeUserPassword (line 2231) -en Duplicate key: enterNewPassword (line 2232) -en Duplicate key: confirmDeleteUser (line 2233) -en Duplicate key: userDeletedSuccessfully (line 2234) -en Duplicate key: defaultBadge (line 2235) -en Duplicate key: kbSettingsSaved (line 2238) -en Duplicate key: failedToSaveSettings (line 2239) -en Duplicate key: modelConfiguration (line 2240) -en Duplicate key: defaultLLMModel (line 2241) -en Duplicate key: selectLLM (line 2242) -en Duplicate key: embeddingModel (line 2243) -en Duplicate key: selectEmbedding (line 2244) -en Duplicate key: rerankModel (line 2245) -en Duplicate key: none (line 2246) -en Duplicate key: indexingChunkingConfig (line 2247) -en Duplicate key: chatHyperparameters (line 2248) -en Duplicate key: precise (line 2249) -en Duplicate key: creative (line 2250) -en Duplicate key: maxResponseTokens (line 2251) -en Duplicate key: retrievalSearchSettings (line 2252) -en Duplicate key: enableHybridSearch (line 2253) -en Duplicate key: hybridSearchDesc (line 2254) -en Duplicate key: hybridWeight (line 2255) -en Duplicate key: pureText (line 2256) -en Duplicate key: pureVector (line 2257) -en Duplicate key: enableQueryExpansion (line 2258) -en Duplicate key: queryExpansionDesc (line 2259) -en Duplicate key: enableHyDE (line 2260) -en Duplicate key: hydeDesc (line 2261) -en Duplicate key: enableReranking (line 2262) -en Duplicate key: rerankingDesc (line 2263) -en Duplicate key: importFolder (line 2266) -en Duplicate key: newGroup (line 2267) -en Duplicate key: noKnowledgeGroups (line 2268) -en Duplicate key: createGroupDesc (line 2269) -en Duplicate key: noDescriptionProvided (line 2270) -en Duplicate key: files (line 2271) -en Duplicate key: filterGroupFiles (line 2272) -en Duplicate key: browseManageFiles (line 2273) -en Duplicate key: navAgent (line 2276) -en Duplicate key: agentTitle (line 2277) -en Duplicate key: agentDesc (line 2278) -en Duplicate key: searchAgent (line 2279) -en Duplicate key: createAgent (line 2280) -en Duplicate key: statusRunning (line 2281) -en Duplicate key: statusStopped (line 2282) -en Duplicate key: btnChat (line 2283) -en Duplicate key: navPlugin (line 2286) -en Duplicate key: pluginTitle (line 2287) -en Duplicate key: pluginDesc (line 2288) -en Duplicate key: searchPlugin (line 2289) -en Duplicate key: installPlugin (line 2290) -en Duplicate key: installedPlugin (line 2291) -en Duplicate key: updatePlugin (line 2292) -en Duplicate key: selectOrganization (line 2295) -en Duplicate key: defaultTenant (line 2296) -en Duplicate key: roleTenantAdmin (line 2297) -en Duplicate key: roleRegularUser (line 2298) -en Duplicate key: creatingRegularUser (line 2299) -en Duplicate key: defaultBadge (line 2300) -en Duplicate key: defaultSettingFailed (line 2301) -en Duplicate key: pluginOfficial (line 2302) -en Duplicate key: pluginCommunity (line 2303) -en Duplicate key: pluginBy (line 2304) -en Duplicate key: pluginConfig (line 2305) -en Duplicate key: updatedAtPrefix (line 2306) -en Duplicate key: plugin1Name (line 2307) -en Duplicate key: plugin1Desc (line 2308) -en Duplicate key: plugin2Name (line 2309) -en Duplicate key: plugin2Desc (line 2310) -en Duplicate key: plugin3Name (line 2311) -en Duplicate key: plugin3Desc (line 2312) -en Duplicate key: plugin4Name (line 2313) -en Duplicate key: plugin4Desc (line 2314) -en Duplicate key: plugin5Name (line 2315) -en Duplicate key: plugin5Desc (line 2316) -en Duplicate key: plugin6Name (line 2317) -en Duplicate key: plugin6Desc (line 2318) -en Duplicate key: agent1Name (line 2319) -en Duplicate key: agent1Desc (line 2320) -en Duplicate key: agent1Time (line 2321) -en Duplicate key: agent2Name (line 2322) -en Duplicate key: agent2Desc (line 2323) -en Duplicate key: agent2Time (line 2324) -en Duplicate key: agent3Name (line 2325) -en Duplicate key: agent3Desc (line 2326) -en Duplicate key: agent3Time (line 2327) -en Duplicate key: agent4Name (line 2328) -en Duplicate key: agent4Desc (line 2329) -en Duplicate key: agent4Time (line 2330) -en Duplicate key: agent5Name (line 2331) -en Duplicate key: agent5Desc (line 2332) -en Duplicate key: agent5Time (line 2333) -en Duplicate key: agent6Name (line 2334) -en Duplicate key: agent6Desc (line 2335) -en Duplicate key: agent6Time (line 2336) -en Duplicate key: agent7Name (line 2337) -en Duplicate key: agent7Desc (line 2338) -en Duplicate key: agent7Time (line 2339) -en Duplicate key: generalSettingsSubtitle (line 2340) -en Duplicate key: userManagementSubtitle (line 2341) -en Duplicate key: modelManagementSubtitle (line 2342) -en Duplicate key: kbSettingsSubtitle (line 2343) -en Duplicate key: tenantsSubtitle (line 2344) -en Duplicate key: allNotes (line 2346) -en Duplicate key: filterNotesPlaceholder (line 2347) -en Duplicate key: noteTitlePlaceholder (line 2348) -en Duplicate key: startWritingPlaceholder (line 2349) -en Duplicate key: previewHeader (line 2350) -en Duplicate key: noContentToPreview (line 2351) -en Duplicate key: hidePreview (line 2352) -en Duplicate key: showPreview (line 2353) -en Duplicate key: directoryLabel (line 2354) -en Duplicate key: uncategorized (line 2355) -en Duplicate key: enterNamePlaceholder (line 2356) -en Duplicate key: subFolderPlaceholder (line 2357) -en Duplicate key: categoryCreated (line 2358) -en Duplicate key: failedToCreateCategory (line 2359) -en Duplicate key: failedToDeleteCategory (line 2360) -en Duplicate key: confirmDeleteCategory (line 2361) -ja Duplicate key: changeUserPassword (line 2231) -ja Duplicate key: enterNewPassword (line 2232) -ja Duplicate key: confirmDeleteUser (line 2233) -ja Duplicate key: userDeletedSuccessfully (line 2234) -ja Duplicate key: embeddingModel (line 2243) -ja Duplicate key: importFolder (line 2266) -ja Duplicate key: files (line 2271) -ja Duplicate key: defaultBadge (line 2300) -ja Duplicate key: noteTitlePlaceholder (line 2348) -ja Duplicate key: uncategorized (line 2355) diff --git a/translation_map.json b/translation_map.json deleted file mode 100644 index c7d01d5..0000000 --- a/translation_map.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - " `💰 Estimated cost: $${estimatedCost.toFixed(2)}, Estimated time: ${duration.toFixed(1)}s`\n )": " `💰 Estimated cost: $${estimatedCost.toFixed(2)}, Estimated time: ${duration.toFixed(1)}s`\n )", - " this.logger.log(`💰 Estimated cost: $${estimatedCost.toFixed(2)}, Estimated time: ${duration.toFixed(1)}s`);": " this.logger.log(`💰 Estimated cost: $${estimatedCost.toFixed(2)}, Estimated time: ${duration.toFixed(1)}s`);" -} diff --git a/true_code.txt b/true_code.txt deleted file mode 100644 index 56ee146..0000000 --- a/true_code.txt +++ /dev/null @@ -1,265 +0,0 @@ -console.log('Final LLM model used (default):', llmModel ? llmModel.name : '无'); -`data: ${JSON.stringify({ type: 'error', data: '请在模型管理中添加LLM模型并配置API密钥' })}\n\n`, -`data: ${JSON.stringify({ type: 'error', data: error.message || '服务器错误' })}\n\n`, -`data: ${JSON.stringify({ type: 'error', data: '未找到LLM模型配置' })}\n\n`, -console.log('ユーザーID:', userId); -console.log('API Key プレフィックス:', modelConfig.apiKey?.substring(0, 10) + '...'); -提供されたテキスト内容を、ユーザーの指示に基づいて修正または改善してください。 -挨拶や結びの言葉(「わかりました、こちらが...」など)は含めず、修正後の内容のみを直接出力してください。 -コンテキスト(現在の内容): -ユーザーの指示: -* 対話内容に基づいてチャットのタイトルを自動生成する -* アプリケーション全体で使用される定数定義 -* Elasticsearch スコアを 0-1 の範囲に正規化する -* Elasticsearch のスコアは 1.0 を超える可能性があるため、正規化が必要 -* ただし、kNN検索の類似度スコアは既に0-1の範囲にある(cosine similarity)ので、 -* 特別な正規化は不要。必要に応じて最小値保護のみ行う。 -* 指定されたファイルのすべてのチャンクを取得 -基于以下知识库内容回答用户问题。 -**重要提示**: 用户已选择特定知识组,请严格基于以下知识库内容回答。如果知识库中没有相关信息,请明确告知用户:"${noMatchMsg}",然后再提供答案。 -知识库内容: -历史对话: -用户问题:{question} -请用Chinese回答,并严格遵循以下 Markdown 格式要求: -1. **段落与结构**: -- 使用清晰的段落分隔,每个要点之间空一行 -- 使用标题(## 或 ###)组织长回答 -2. **文本格式**: -- 使用 **粗体** 强调重要概念和关键词 -- 使用列表(- 或 1.)组织多个要点 -- 使用 \`代码\` 标记技术术语、命令、文件名 -3. **代码展示**: -- 使用代码块展示代码,并指定语言: -return "示例" -- 支持语言:python, javascript, typescript, java, bash, sql 等 -4. **图表与可视化**: -- 使用 Mermaid 语法绘制流程图、序列图等: -A[开始] --> B[处理] -B --> C[结束] -- 适用场景:流程、架构、状态机、时序图 -5. **其他要求**: -- 回答精炼准确 -- 多步骤操作使用有序列表 -- 对比类信息建议用表格展示(如果适用) -作为智能助手,请回答用户的问题。 -请用Chinese回答。 -以下のナレッジベースの内容に基づいてユーザーの質問に答えてください。 -**重要**: ユーザーが特定の知識グループを選択しました。以下のナレッジベースの内容に厳密に基づいて回答してください。ナレッジベースに関連情報がない場合は、「${noMatchMsg}」とユーザーに明示的に伝えてから、回答を提供してください。 -ナレッジベースの内容: -会話履歴: -ユーザーの質問:{question} -Japaneseで回答してください。以下の Markdown 書式要件に厳密に従ってください: -1. **段落と構造**: -- 明確な段落分けを使用し、要点間に空行を入れる -- 長い回答には見出し(## または ###)を使用 -2. **テキスト書式**: -- 重要な概念やキーワードを強調するために **太字** を使用 -- 複数のポイントを整理するためにリスト(- または 1.)を使用 -- 技術用語、コマンド、ファイル名をマークするために \`コード\` を使用 -3. **コード表示**: -- 言語を指定してコードブロックを使用: -return "例" -- 対応言語:python, javascript, typescript, java, bash, sql など -4. **図表とチャート**: -- フローチャート、シーケンス図などに Mermaid 構文を使用: -A[開始] --> B[処理] -B --> C[終了] -- 使用例:プロセスフロー、アーキテクチャ図、状態図、シーケンス図 -5. **その他の要件**: -- 簡潔で明確な回答を心がける -- 複数のステップがある場合は番号付きリストを使用 -- 比較情報には表を使用(該当する場合) -インテリジェントアシスタントとして、ユーザーの質問に答えてください。 -Japaneseで回答してください。 -return `你是一个文档分析师。请阅读以下文本(文档开Header分),并生成一个简炼、专业的标题(不超过50个字符)。 -只返回标题文本。不要包含任何解释性文字或前导词(如“标题是:”)。 -语言:Chinese -文本内容: -return `あなたはドキュメントアナライザーです。以下のテキスト(ドキュメントの冒頭部分)を読み、簡潔でプロフェッショナルなタイトル(最大50文字)を生成してください。 -タイトルテキストのみを返してください。説明文や前置き(例:「タイトルは:」)は含めないでください。 -言語:Japanese -テキスト: -return `根据以下对话片段,生成一个简短、描述性的标题(不超过50个字符),总结讨论的主题。 -只返回标题文本。不要包含任何前导词。 -片段: -用户: ${userMessage} -助手: ${aiResponse}`; -return `以下の会話スニペットに基づいて、トピックを要約する短く説明的なタイトル(最大50文字)を生成してください。 -タイトルのみを返してください。前置きは不要です。 -スニペット: -ユーザー: ${userMessage} -アシスタント: ${aiResponse}`; -* Chunk configurationサービス -* チャンクパラメータの検証と管理を担当し、モデルの制限や環境変数の設定に適合していることを確認します -* 制限の優先順位: -* 1. 環境変数 (MAX_CHUNK_SIZE, MAX_OVERLAP_SIZE) -* 2. データベース内のモデル設定 (maxInputTokens, maxBatchSize) -* 3. デフォルト値 -* モデルの制限設定を取得(データベースから読み込み) -const providerName = modelConfig.providerName || '不明'; -` - プロバイダー: ${providerName}\n` + -` - Token制限: ${maxInputTokens}\n` + -` - ベクトルモデルか: ${isVectorModel}`, -* Chunk configurationを検証および修正 -* 優先順位: 環境変数の上限 > モデルの制限 > ユーザー設定 -* 推奨されるバッチサイズを取得 -* チャンク数を推定 -* ベクトル次元の検証 -* 設定概要を取得(ログ用) -`Chunk size: ${chunkSize} tokens (制限: ${limits.maxInputTokens})`, -`重なりサイズ: ${chunkOverlap} tokens`, -`バッチサイズ: ${limits.maxBatchSize}`, -* フロントエンド用のConfig limitsを取得 -* フロントエンドのスライダーの上限設定に使用 -throw new Error(`埋め込みモデル設定 ${embeddingModelConfigId} が見つかりません`); -throw new Error(`モデル ${modelConfig.name} は無効化されているため、埋め込みベクトルを生成できません`); -throw new Error(`モデル ${modelConfig.name} に baseUrl が設定されていません`); -* モデルIDに基づいて最大バッチサイズを決定 -* 単一バッチの埋め込み処理 -`総計 ${totalLength} 文字、平均 ${Math.round(avgLength)} 文字、` + -`モデル制限: ${modelConfig.maxInputTokens || 8192} tokens` -`テキスト長がモデルの制限。` + -`現在: ${texts.length} 個のテキストで計 ${totalLength} 文字、` + -`モデル制限: ${modelConfig.maxInputTokens || 8192} tokens。` + -`アドバイス: Chunk sizeまたはバッチサイズを小さくしてください` -this.logger.error(`リクエストパラメータ: model=${modelConfig.modelId}, inputLength=${texts[0]?.length}`); -throw new Error(`埋め込み API の呼び出しに失敗しました: ${response.statusText} - ${errorText}`); -* Fetch chunk configuration limits(フロントエンドのスライダー設定用) -* クエリパラメータ: embeddingModelId - Embedding model ID -* Fast Mode処理(既存フロー) -* Precise Mode処理(新規フロー) -* Precise Modeの結果をインデックス -* PDF の特定ページの画像を取得 -if (error.message && (error.message.includes('context length') || error.message.includes('コンテキスト長 exceeds limit ') || error.message.includes('コンテキスト長 exceeds limit '))) { -* バッチ処理、メモリ制御付き -* 失敗したファイルのベクトル化を再試行 -throw new NotFoundException('ファイルが存在しません'); -* ファイルのすべてのチャンク情報を取得 -* モデルの実際の次元数を取得(キャッシュ確認とプローブロジック付き) -* AIを使用して文書のタイトルを自動生成する -* 現在のメモリ使用状況を取得 -* メモリ exceeds limit に近づいているかチェック -* メモリが利用可能になるまで待機(タイムアウトあり) -throw new Error(`メモリ待機がタイムアウトしました: 現在 ${this.getMemoryUsage().heapUsed}MB > ${this.MAX_MEMORY_MB * 0.85}MB`); -* ガベージコレクションを強制実行(可能な場合) -* バッチサイズを動的に調整 -* 大規模データの処理:自動バッチングとメモリ制御 -* 処理に必要なメモリを見積もる -* バッチ処理を使用すべきかチェック -* LibreOffice サービスインターフェース定義 -* LibreOffice サービスの状態をチェック -* ドキュメントを PDF に変換 -* @param filePath 変換するファイルのパス -* @returns PDF ファイルのパス -throw new Error(`ファイルが存在しません: ${filePath}`); -throw new Error('変換がタイムアウトしました。ファイルが大きすぎる可能性があります'); -throw new Error(`変換に失敗しました: ${detail}`); -throw new Error(`変換に失敗しました: ${lastError.message}`); -throw new Error('LibreOffice サービスが実行されていません。サービスの状態を確認してください'); -throw new Error('LibreOffice サービスとの接続が切断されました。サービスが不安定である可能性があります'); -* ファイルの一括変換 -* サービスのバージョン情報を取得 -@Min(1, { message: 'ベクトル次元の最小値は 1 です' }) -@Max(4096, { message: 'ベクトル次元の最大値は 4096 です(Elasticsearch の制限)' }) -* モデルの入力トークン制限(embedding/rerank にのみ有効) -* バッチ処理の制限(embedding/rerank にのみ有効) -* ベトルモデルかどうか -* モデルプロバイダー名 -* このモデルを有効にするかどうか -* このモデルをデフォルトとして使用するかどうか -* モデルの入力トークン制限 -* 例: OpenAI=8191, Gemini=2048 -* 一括処理制限(1回のリクエストあたりの最大入力数) -* 例: OpenAI=2048, Gemini=100 -* ベトルモデルかどうか(システム設定での識別用) -* ユーザーは使用しないモデルを無効にして、誤選択を防ぐことができます -* 各タイプ(llm, embedding, rerank)ごとに1つのみデフォルトにできます -* モデルプロバイダー名(表示および識別用) -* 例: "OpenAI", "Google Gemini", "Custom" -* 指定されたモデルをデフォルトに設定 -* 指定されたタイプのデフォルトモデルを取得 -* 厳密なルール:Index Chat Configで指定されたモデルのみを返し、なければエラーを投げる -* PDF 转图片接口定义 -* PDF を画像リストに変換します -* ImageMagick の convert コマンドを使用します -throw new Error(`PDF ファイルが存在しません: ${pdfPath}`); -throw new Error('PDF のページ数を取得できません'); -throw new Error(`Python での変換に失敗しました: ${result.error}`); -throw new Error(`PDF から画像への変換に失敗しました: ${error.message}`); -* 複数の PDF を一括変換 -* 画像ファイルのクリーンアップ -* ディレクトリのクリーンアップ -* 画像品質が妥当か確認 -throw new Error('Embedding model IDが提供されていません'); -* Search resultsの重複排除 -* クエリを拡張してバリエーションを生成 -* 仮想的なドキュメント(HyDE)を生成 -* 内部タスク用の LLM インスタンスを取得 -* リランクの実行 -* @param query ユーザーのクエリ -* @param documents 候補ドキュメントリスト -* @param userId ユーザーID -* @param rerankModelId 選択された Rerank モデル設定ID -* @param topN 返す結果の数 (上位 N 個) -return { message: '对话历史删除成功' }; -`ユーザー ${req.user.id} がファイルをアップロードしました: ${file.originalname} (${this.formatBytes(file.size)})`, -console.log('パスワード:', randomPassword); -console.log('=== updateLanguage デバッグ ==='); -console.log('=== getLanguage デバッグ ==='); -* システム全体のグローバル設定を取得する -* システム全体のグローバル設定を更新する -* Vision 服务接口定义 -* 単一画像の分析(ドキュメントページ) -* 実際の画像分析を実行 -page: pageIndex ? ` (第 ${pageIndex} ページ)` : '', -* 再試行可能なエラーかどうかを判断 -if (errorCode === 429 || errorMessage.includes('rate limit') || errorMessage.includes('リクエストが多すぎます')) { -* 遅延関数 -* 複数画像の一括分析 -* 画像品質のチェック -return { isGood: false, reason: `ファイルが小さすぎます (${sizeKB.toFixed(2)}KB)`, score: 0 }; -return { isGood: false, reason: `ファイルが大きすぎます (${sizeKB.toFixed(2)}KB)`, score: 0 }; -* サポートされている画像ファイルかどうかを確認 -* MIME タイプを取得 -* 旧インターフェース互換:単一画像の内容を抽出 -* コスト制御およびクォータ管理サービス -* Vision Pipeline の API 呼び出しコストを管理するために使用されます -* 処理コストの推定 -* ユーザーのクォータをチェック -reason: `クォータ不足: 残り $${quota.remaining.toFixed(2)}, 必要 $${estimatedCost.toFixed(2)}`, -* クォータの差し引き -* ユーザーのクォータを取得 -throw new Error(`ユーザー ${userId} は存在しません`); -* 月間クォータのチェックとリセット -* ユーザーのクォータ制限を設定 -* コストレポートの取得 -* コスト警告閾値のチェック -message: `⚠️ クォータ使用率が ${usagePercent.toFixed(1)}% に達しました。残り $${quota.remaining.toFixed(2)}`, -message: `💡 クォータ使用率 ${usagePercent.toFixed(1)}%。コストの管理に注意してください`, -* コスト表示のフォーマット -* 時間表示のフォーマット -return `${seconds.toFixed(0)}秒`; -return `${minutes}分${remainingSeconds.toFixed(0)}秒`; -* Vision Pipeline サービス(コスト制御付き) -* これは vision-pipeline.service.ts の拡張版であり、コスト制御が統合されています -* メイン処理フロー:Precise Mode(コスト制御付き) -this.updateStatus('converting', 10, 'ドキュメント形式を変換中...'); -this.updateStatus('splitting', 30, 'PDF を画像に変換中...'); -throw new Error('PDF から画像への変換に失敗しました。画像が生成されませんでした'); -this.updateStatus('checking', 40, 'クォータを確認し、コストを見積もり中...'); -this.updateStatus('analyzing', 50, 'ビジョンモデルを使用してページをAnalyzing...'); -this.updateStatus('completed', 100, '処理が完了しました。一時ファイルをクリーンアップ中...'); -* Vision モデル設定の取得 -throw new Error(`モデル設定が見つかりません: ${modelId}`); -* PDF への変換 -* 形式検出とモードの推奨(コスト見積もり付き) -reason: `サポートされていないファイル形式です: ${ext}`, -warnings: ['Fast Mode(テキスト抽出のみ)を使用します'], -reason: `形式 ${ext} はPrecise Modeをサポートしていません`, -reason: 'ファイルが大きいため、完全な情報を保持するためにPrecise Modeを推奨します', -warnings: ['処理時間が長くなる可能性があります', 'API 費用が発生します'], -reason: 'Precise Modeが利用可能です。テキストと画像の混合コンテンツを保持できます', -warnings: ['API 費用が発生します'], -* ユーザーのクォータ情報を取得 -* 処理状態の更新(リアルタイムフィードバック用) -* Vision Pipeline 接口定义 \ No newline at end of file