chore: 清理根目录冗余文件(翻译工具/旧脚本/调试文件/截图等)

删除约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 <noreply@anthropic.com>
This commit is contained in:
Developer
2026-06-16 14:04:53 +08:00
parent 9330256e13
commit 3d73618270
49 changed files with 5 additions and 14188 deletions
-26
View File
@@ -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.
-13
View File
@@ -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()`.
-521
View File
@@ -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
-337
View File
@@ -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
"RAGRetrieval-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`);
-332
View File
@@ -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
"RAGRetrieval-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)
-43
View File
@@ -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);
-133
View File
@@ -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'],"
}
-60
View File
@@ -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.`);
-52
View File
@@ -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();
-404
View File
@@ -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; // 秒
-49
View File
@@ -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
-38
View File
@@ -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 "======================================================="
-17
View File
@@ -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');
-14
View File
@@ -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();
}
-7250
View File
@@ -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}`,"
}
]
}
-50
View File
@@ -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
-184
View File
@@ -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!');
-87
View File
@@ -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])
-43
View File
@@ -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 默认预期的服务名字
# 如果目录叫 AuraKdocker-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 "======================================================="
-45
View File
@@ -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');
-31
View File
@@ -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")
-37
View File
@@ -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`);
-37
View File
@@ -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));
-29
View File
@@ -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.');
-4
View File
@@ -1,4 +0,0 @@
[
"d:\\workspace\\AuraK\\server\\src\\knowledge-base\\embedding.service.ts",
"d:\\workspace\\AuraK\\server\\src\\vision\\vision.service.ts"
]
-89
View File
@@ -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!');
-26
View File
@@ -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);
}
-21
View File
@@ -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!');
-74
View File
@@ -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.")
View File
BIN
View File
Binary file not shown.
-1551
View File
@@ -1,1551 +0,0 @@
zh duplicate: aiCommandsError line 602
zh duplicate: appTitle line 603
zh duplicate: loginTitle line 604
zh duplicate: loginDesc line 605
zh duplicate: loginButton line 606
zh duplicate: loginError line 607
zh duplicate: unknownError line 608
zh duplicate: usernamePlaceholder line 609
zh duplicate: passwordPlaceholder line 610
zh duplicate: registerButton line 611
zh duplicate: confirm line 612
zh duplicate: cancel line 613
zh duplicate: confirmTitle line 614
zh duplicate: confirmDeleteGroup line 615
zh duplicate: systemConfiguration line 617
zh duplicate: noFiles line 618
zh duplicate: noFilesDesc line 619
zh duplicate: addFile line 620
zh duplicate: clearAll line 621
zh duplicate: uploading line 622
zh duplicate: editNotebookTitle line 623
zh duplicate: noteCreatedSuccess line 624
zh duplicate: noteCreatedFailed line 625
zh duplicate: errorRenderFlowchart line 626
zh duplicate: errorLoadData line 627
zh duplicate: confirmUnsupportedFile line 628
zh duplicate: errorReadFile line 629
zh duplicate: successUploadFile line 630
zh duplicate: errorUploadFile line 631
zh duplicate: fileAddedToGroup line 632
zh duplicate: failedToAddToGroup line 633
zh duplicate: fileRemovedFromGroup line 634
zh duplicate: failedToRemoveFromGroup line 635
zh duplicate: errorProcessFile line 636
zh duplicate: errorTitleContentRequired line 637
zh duplicate: successNoteUpdated line 638
zh duplicate: successNoteCreated line 639
zh duplicate: errorSaveFailed line 640
zh duplicate: confirmDeleteNote line 641
zh duplicate: successNoteDeleted line 642
zh duplicate: confirmRemoveFileFromGroup line 643
zh duplicate: togglePreviewOpen line 644
zh duplicate: togglePreviewClose line 645
zh duplicate: noteTitlePlaceholder line 646
zh duplicate: noteContentPlaceholder line 647
zh duplicate: markdownPreviewArea line 648
zh duplicate: back line 649
zh duplicate: chatWithGroup line 650
zh duplicate: chatWithFile line 651
zh duplicate: filesCountLabel line 652
zh duplicate: notesCountLabel line 653
zh duplicate: indexIntoKB line 654
zh duplicate: noFilesOrNotes line 655
zh duplicate: sidebarTitle line 657
zh duplicate: backToWorkspace line 658
zh duplicate: goToAdmin line 659
zh duplicate: sidebarDesc line 660
zh duplicate: tabFiles line 661
zh duplicate: files line 662
zh duplicate: notes line 663
zh duplicate: tabSettings line 664
zh duplicate: langZh line 665
zh duplicate: langEn line 666
zh duplicate: langJa line 667
zh duplicate: navGlobal line 668
zh duplicate: navTenants line 669
zh duplicate: navSystemModels line 670
zh duplicate: navTenantManagement line 671
zh duplicate: navUsersTeam line 672
zh duplicate: navTenantSettings line 673
zh duplicate: adminConsole line 674
zh duplicate: globalDashboard line 675
zh duplicate: statusIndexing line 676
zh duplicate: statusReady line 677
zh duplicate: ragSettings line 680
zh duplicate: enableRerank line 681
zh duplicate: enableRerankDesc line 682
zh duplicate: selectRerankModel line 683
zh duplicate: selectModelPlaceholder line 684
zh duplicate: headerModelSelection line 686
zh duplicate: headerHyperparams line 687
zh duplicate: headerIndexing line 688
zh duplicate: headerRetrieval line 689
zh duplicate: btnManageModels line 690
zh duplicate: lblLLM line 692
zh duplicate: lblEmbedding line 693
zh duplicate: lblRerankRef line 694
zh duplicate: lblTemperature line 695
zh duplicate: lblMaxTokens line 696
zh duplicate: lblChunkSize line 697
zh duplicate: lblChunkOverlap line 698
zh duplicate: lblTopK line 699
zh duplicate: lblRerank line 700
zh duplicate: idxModalTitle line 702
zh duplicate: idxDesc line 703
zh duplicate: idxFiles line 704
zh duplicate: idxMethod line 705
zh duplicate: idxEmbeddingModel line 706
zh duplicate: idxStart line 707
zh duplicate: idxCancel line 708
zh duplicate: idxAuto line 709
zh duplicate: idxCustom line 710
zh duplicate: mmTitle line 712
zh duplicate: mmAddBtn line 713
zh duplicate: mmEdit line 714
zh duplicate: mmDelete line 715
zh duplicate: mmEmpty line 716
zh duplicate: mmFormName line 717
zh duplicate: mmFormProvider line 718
zh duplicate: mmFormModelId line 719
zh duplicate: mmFormBaseUrl line 720
zh duplicate: mmFormType line 721
zh duplicate: mmFormVision line 722
zh duplicate: mmFormDimensions line 723
zh duplicate: mmFormDimensionsHelp line 724
zh duplicate: mmSave line 725
zh duplicate: mmCancel line 726
zh duplicate: mmErrorNotAuthenticated line 727
zh duplicate: mmErrorTitle line 728
zh duplicate: modelEnabled line 729
zh duplicate: modelDisabled line 730
zh duplicate: confirmChangeEmbeddingModel line 731
zh duplicate: embeddingModelWarning line 732
zh duplicate: sourcePreview line 733
zh duplicate: matchScore line 734
zh duplicate: copyContent line 735
zh duplicate: copySuccess line 736
zh duplicate: selectLLMModel line 739
zh duplicate: selectEmbeddingModel line 740
zh duplicate: defaultForUploads line 741
zh duplicate: noRerankModel line 742
zh duplicate: vectorSimilarityThreshold line 743
zh duplicate: rerankSimilarityThreshold line 744
zh duplicate: filterLowResults line 745
zh duplicate: fullTextSearch line 746
zh duplicate: hybridVectorWeight line 747
zh duplicate: hybridVectorWeightDesc line 748
zh duplicate: lblQueryExpansion line 749
zh duplicate: lblHyDE line 750
zh duplicate: lblQueryExpansionDesc line 751
zh duplicate: lblHyDEDesc line 752
zh duplicate: apiKeyValidationFailed line 754
zh duplicate: keepOriginalKey line 755
zh duplicate: leaveEmptyNoChange line 756
zh duplicate: mmFormApiKey line 757
zh duplicate: mmFormApiKeyPlaceholder line 758
zh duplicate: reconfigureFile line 761
zh duplicate: modifySettings line 762
zh duplicate: filesCount line 763
zh duplicate: allFilesIndexed line 764
zh duplicate: noEmbeddingModels line 765
zh duplicate: reconfigure line 766
zh duplicate: refresh line 767
zh duplicate: settings line 768
zh duplicate: needLogin line 769
zh duplicate: citationSources line 770
zh duplicate: chunkNumber line 771
zh duplicate: getUserListFailed line 772
zh duplicate: usernamePasswordRequired line 773
zh duplicate: passwordMinLength line 774
zh duplicate: userCreatedSuccess line 775
zh duplicate: createUserFailed line 776
zh duplicate: userPromotedToAdmin line 777
zh duplicate: userDemotedFromAdmin line 778
zh duplicate: updateUserFailed line 779
zh duplicate: confirmDeleteUser line 780
zh duplicate: deleteUser line 781
zh duplicate: deleteUserFailed line 782
zh duplicate: userDeletedSuccessfully line 783
zh duplicate: makeUserAdmin line 784
zh duplicate: makeUserRegular line 785
zh duplicate: loading line 786
zh duplicate: noUsers line 787
zh duplicate: aiAssistant line 790
zh duplicate: polishContent line 791
zh duplicate: expandContent line 792
zh duplicate: summarizeContent line 793
zh duplicate: translateToEnglish line 794
zh duplicate: fixGrammar line 795
zh duplicate: aiCommandInstructPolish line 796
zh duplicate: aiCommandInstructExpand line 797
zh duplicate: aiCommandInstructSummarize line 798
zh duplicate: aiCommandInstructTranslateToEn line 799
zh duplicate: aiCommandInstructFixGrammar line 800
zh duplicate: aiCommandsPreset line 801
zh duplicate: aiCommandsCustom line 802
zh duplicate: aiCommandsCustomPlaceholder line 803
zh duplicate: aiCommandsReferenceContext line 804
zh duplicate: aiCommandsStartGeneration line 805
zh duplicate: aiCommandsResult line 806
zh duplicate: aiCommandsGenerating line 807
zh duplicate: aiCommandsApplyResult line 808
zh duplicate: aiCommandsGoBack line 809
zh duplicate: aiCommandsReset line 810
zh duplicate: aiCommandsModalPreset line 811
zh duplicate: aiCommandsModalCustom line 812
zh duplicate: aiCommandsModalCustomPlaceholder line 813
zh duplicate: aiCommandsModalBasedOnSelection line 814
zh duplicate: aiCommandsModalResult line 815
zh duplicate: aiCommandsModalApply line 816
zh duplicate: fillAllFields line 819
zh duplicate: passwordMismatch line 820
zh duplicate: newPasswordMinLength line 821
zh duplicate: changePasswordFailed line 822
zh duplicate: changePasswordTitle line 823
zh duplicate: changing line 824
zh duplicate: searchResults line 825
zh duplicate: visionModelSettings line 828
zh duplicate: defaultVisionModel line 829
zh duplicate: loadVisionModelFailed line 830
zh duplicate: loadFailed line 831
zh duplicate: saveVisionModelFailed line 832
zh duplicate: noVisionModels line 833
zh duplicate: selectVisionModel line 834
zh duplicate: visionModelHelp line 835
zh duplicate: mmErrorNameRequired line 836
zh duplicate: mmErrorModelIdRequired line 837
zh duplicate: mmErrorBaseUrlRequired line 838
zh duplicate: mmRequiredAsterisk line 839
zh duplicate: typeLLM line 841
zh duplicate: typeEmbedding line 842
zh duplicate: typeRerank line 843
zh duplicate: typeVision line 844
zh duplicate: welcome line 846
zh duplicate: placeholderWithFiles line 847
zh duplicate: placeholderEmpty line 848
zh duplicate: analyzing line 849
zh duplicate: errorGeneric line 850
zh duplicate: errorLabel line 851
zh duplicate: errorNoModel line 852
zh duplicate: aiDisclaimer line 853
zh duplicate: confirmClear line 854
zh duplicate: removeFile line 855
zh duplicate: apiError line 856
zh duplicate: geminiError line 857
zh duplicate: processedButNoText line 858
zh duplicate: unitByte line 859
zh duplicate: readingFailed line 860
zh duplicate: copy line 862
zh duplicate: copied line 863
zh duplicate: logout line 866
zh duplicate: changePassword line 867
zh duplicate: userManagement line 868
zh duplicate: userList line 869
zh duplicate: addUser line 870
zh duplicate: username line 871
zh duplicate: password line 872
zh duplicate: confirmPassword line 873
zh duplicate: currentPassword line 874
zh duplicate: newPassword line 875
zh duplicate: createUser line 876
zh duplicate: admin line 877
zh duplicate: user line 878
zh duplicate: adminUser line 879
zh duplicate: confirmChange line 880
zh duplicate: changeUserPassword line 881
zh duplicate: enterNewPassword line 882
zh duplicate: createdAt line 883
zh duplicate: newChat line 884
zh duplicate: selectKnowledgeGroups line 887
zh duplicate: searchGroupsPlaceholder line 888
zh duplicate: done line 889
zh duplicate: all line 890
zh duplicate: noGroupsFound line 891
zh duplicate: noGroups line 892
zh duplicate: autoRefresh line 895
zh duplicate: refreshInterval line 896
zh duplicate: kbManagement line 899
zh duplicate: kbManagementDesc line 900
zh duplicate: searchPlaceholder line 901
zh duplicate: allGroups line 902
zh duplicate: allStatus line 903
zh duplicate: statusReadyFragment line 904
zh duplicate: statusFailedFragment line 905
zh duplicate: statusIndexingFragment line 906
zh duplicate: uploadFile line 907
zh duplicate: fileName line 908
zh duplicate: size line 909
zh duplicate: status line 910
zh duplicate: groups line 911
zh duplicate: actions line 912
zh duplicate: groupsActions line 913
zh duplicate: noFilesFound line 914
zh duplicate: showingRange line 915
zh duplicate: confirmDeleteFile line 916
zh duplicate: fileDeleted line 917
zh duplicate: deleteFailed line 918
zh duplicate: confirmClearKB line 919
zh duplicate: kbCleared line 920
zh duplicate: clearFailed line 921
zh duplicate: loginRequired line 922
zh duplicate: uploadErrors line 923
zh duplicate: uploadWarning line 924
zh duplicate: uploadFailed line 925
zh duplicate: preview line 926
zh duplicate: addGroup line 927
zh duplicate: delete line 928
zh duplicate: retry line 929
zh duplicate: retrying line 930
zh duplicate: retrySuccess line 931
zh duplicate: retryFailed line 932
zh duplicate: chunkInfo line 933
zh duplicate: totalChunks line 934
zh duplicate: chunkIndex line 935
zh duplicate: contentLength line 936
zh duplicate: position line 937
zh duplicate: reconfigureTitle line 940
zh duplicate: reconfigureDesc line 941
zh duplicate: indexingConfigTitle line 942
zh duplicate: indexingConfigDesc line 943
zh duplicate: pendingFiles line 944
zh duplicate: processingMode line 945
zh duplicate: analyzingFile line 946
zh duplicate: recommendationReason line 947
zh duplicate: fastMode line 948
zh duplicate: fastModeDesc line 949
zh duplicate: preciseMode line 950
zh duplicate: preciseModeDesc line 951
zh duplicate: fastModeFeatures line 952
zh duplicate: fastFeature1 line 953
zh duplicate: fastFeature2 line 954
zh duplicate: fastFeature3 line 955
zh duplicate: fastFeature4 line 956
zh duplicate: fastFeature5 line 957
zh duplicate: preciseModeFeatures line 958
zh duplicate: preciseFeature1 line 959
zh duplicate: preciseFeature2 line 960
zh duplicate: preciseFeature3 line 961
zh duplicate: preciseFeature4 line 962
zh duplicate: preciseFeature5 line 963
zh duplicate: preciseFeature6 line 964
zh duplicate: embeddingModel line 965
zh duplicate: pleaseSelect line 966
zh duplicate: pleaseSelectKnowledgeGroupFirst line 967
zh duplicate: selectUnassignGroupWarning line 968
zh duplicate: chunkConfig line 969
zh duplicate: chunkSize line 970
zh duplicate: min line 971
zh duplicate: max line 972
zh duplicate: chunkOverlap line 973
zh duplicate: modelLimitsInfo line 974
zh duplicate: model line 975
zh duplicate: maxChunkSize line 976
zh duplicate: maxOverlapSize line 977
zh duplicate: maxBatchSize line 978
zh duplicate: envLimitWeaker line 979
zh duplicate: optimizationTips line 980
zh duplicate: tipChunkTooLarge line 981
zh duplicate: tipOverlapSmall line 982
zh duplicate: tipMaxValues line 983
zh duplicate: tipPreciseCost line 984
zh duplicate: selectEmbeddingFirst line 985
zh duplicate: confirmPreciseCost line 986
zh duplicate: startProcessing line 987
zh duplicate: notebooks line 990
zh duplicate: notebooksDesc line 991
zh duplicate: createNotebook line 992
zh duplicate: chatWithNotebook line 993
zh duplicate: editNotebook line 994
zh duplicate: deleteNotebook line 995
zh duplicate: noDescription line 996
zh duplicate: noNotebooks line 999
zh duplicate: createFailed line 1000
zh duplicate: confirmDeleteNotebook line 1001
zh duplicate: createNotebookTitle line 1008
zh duplicate: createFailedRetry line 1009
zh duplicate: updateFailedRetry line 1010
zh duplicate: name line 1011
zh duplicate: nameHelp line 1012
zh duplicate: namePlaceholder line 1013
zh duplicate: shortDescription line 1014
zh duplicate: descPlaceholder line 1015
zh duplicate: creating line 1019
zh duplicate: createNow line 1020
zh duplicate: saving line 1021
zh duplicate: save line 1022
zh duplicate: chatTitle line 1025
zh duplicate: chatDesc line 1026
zh duplicate: viewHistory line 1027
zh duplicate: saveSettingsFailed line 1028
zh duplicate: loginToUpload line 1029
zh duplicate: fileSizeLimitExceeded line 1030
zh duplicate: unsupportedFileType line 1031
zh duplicate: readFailed line 1032
zh duplicate: loadHistoryFailed line 1033
zh duplicate: loadingUserData line 1034
zh duplicate: errorMessage line 1035
zh duplicate: welcomeMessage line 1036
zh duplicate: selectKnowledgeGroup line 1037
zh duplicate: allKnowledgeGroups line 1038
zh duplicate: unknownGroup line 1039
zh duplicate: selectedGroupsCount line 1040
zh duplicate: generalSettings line 1043
zh duplicate: modelManagement line 1044
zh duplicate: languageSettings line 1045
zh duplicate: passwordChangeSuccess line 1046
zh duplicate: passwordChangeFailed line 1047
zh duplicate: create line 1048
zh duplicate: validationFailedMsg line 1049
zh duplicate: navChat line 1053
zh duplicate: navCoach line 1054
zh duplicate: navKnowledge line 1055
zh duplicate: navKnowledgeGroups line 1056
zh duplicate: navNotebook line 1057
zh duplicate: notebookDesc line 1058
zh duplicate: newNote line 1059
zh duplicate: editNote line 1060
zh duplicate: noNotesFound line 1061
zh duplicate: startByCreatingNote line 1062
zh duplicate: navCrawler line 1063
zh duplicate: expandMenu line 1064
zh duplicate: switchLanguage line 1065
zh duplicate: importFolder line 1067
zh duplicate: createPDFNote line 1070
zh duplicate: screenshotPreview line 1071
zh duplicate: associateKnowledgeGroup line 1072
zh duplicate: globalNoSpecificGroup line 1073
zh duplicate: title line 1074
zh duplicate: enterNoteTitle line 1075
zh duplicate: contentOCR line 1076
zh duplicate: extractingText line 1077
zh duplicate: analyzingImage line 1078
zh duplicate: noTextExtracted line 1079
zh duplicate: saveNote line 1080
zh duplicate: page line 1083
zh duplicate: placeholderText line 1084
zh duplicate: createNewNotebook line 1087
zh duplicate: nameField line 1088
zh duplicate: required line 1089
zh duplicate: exampleResearch line 1090
zh duplicate: shortDescriptionField line 1091
zh duplicate: describePurpose line 1092
zh duplicate: creationFailed line 1095
zh duplicate: preparingPDFConversion line 1098
zh duplicate: pleaseWait line 1099
zh duplicate: convertingPDF line 1100
zh duplicate: pdfConversionFailed line 1101
zh duplicate: pdfConversionError line 1102
zh duplicate: pdfLoadFailed line 1103
zh duplicate: pdfLoadError line 1104
zh duplicate: downloadingPDF line 1105
zh duplicate: loadingPDF line 1106
zh duplicate: zoomOut line 1107
zh duplicate: zoomIn line 1108
zh duplicate: resetZoom line 1109
zh duplicate: selectPageNumber line 1110
zh duplicate: enterPageNumber line 1111
zh duplicate: exitSelectionMode line 1112
zh duplicate: clickToSelectAndNote line 1113
zh duplicate: regeneratePDF line 1114
zh duplicate: downloadPDF line 1115
zh duplicate: openInNewWindow line 1116
zh duplicate: exitFullscreen line 1117
zh duplicate: fullscreenDisplay line 1118
zh duplicate: pdfPreview line 1119
zh duplicate: converting line 1120
zh duplicate: generatePDFPreview line 1121
zh duplicate: previewNotSupported line 1122
zh duplicate: confirmRegeneratePDF line 1125
zh duplicate: pdfPreviewReady line 1128
zh duplicate: convertingInProgress line 1129
zh duplicate: conversionFailed line 1130
zh duplicate: generatePDFPreviewButton line 1131
zh duplicate: checkPDFStatusFailed line 1134
zh duplicate: requestRegenerationFailed line 1135
zh duplicate: downloadPDFFailed line 1136
zh duplicate: openPDFInNewTabFailed line 1137
zh duplicate: invalidFile line 1140
zh duplicate: incompleteFileInfo line 1141
zh duplicate: unsupportedFileFormat line 1142
zh duplicate: willUseFastMode line 1143
zh duplicate: formatNoPrecise line 1144
zh duplicate: smallFileFastOk line 1145
zh duplicate: mixedContentPreciseRecommended line 1146
zh duplicate: willIncurApiCost line 1147
zh duplicate: largeFilePreciseRecommended line 1148
zh duplicate: longProcessingTime line 1149
zh duplicate: highApiCost line 1150
zh duplicate: considerFileSplitting line 1151
zh duplicate: dragDropUploadTitle line 1154
zh duplicate: dragDropUploadDesc line 1155
zh duplicate: supportedFormats line 1156
zh duplicate: browseFiles line 1157
zh duplicate: recommendationMsg line 1160
zh duplicate: autoAdjustChunk line 1161
zh duplicate: autoAdjustOverlap line 1162
zh duplicate: autoAdjustOverlapMin line 1163
zh duplicate: loadLimitsFailed line 1164
zh duplicate: maxValueMsg line 1165
zh duplicate: overlapRatioLimit line 1166
zh duplicate: onlyAdminCanModify line 1167
zh duplicate: dragToSelect line 1168
zh duplicate: fillTargetName line 1171
zh duplicate: submitFailed line 1172
zh duplicate: importFolderTitle line 1173
zh duplicate: importFolderTip line 1174
zh duplicate: lblTargetGroup line 1175
zh duplicate: placeholderNewGroup line 1176
zh duplicate: importToCurrentGroup line 1177
zh duplicate: nextStep line 1178
zh duplicate: selectedFilesCount line 1182
zh duplicate: clickToSelectFolder line 1183
zh duplicate: selectFolderTip line 1184
zh duplicate: importComplete line 1185
zh duplicate: importedFromLocalFolder line 1186
zh duplicate: historyTitle line 1189
zh duplicate: confirmDeleteHistory line 1190
zh duplicate: deleteHistorySuccess line 1191
zh duplicate: deleteHistoryFailed line 1192
zh duplicate: yesterday line 1193
zh duplicate: daysAgo line 1194
zh duplicate: historyMessages line 1195
zh duplicate: noHistory line 1196
zh duplicate: noHistoryDesc line 1197
zh duplicate: loadMore line 1198
zh duplicate: loadingHistoriesFailed line 1199
zh duplicate: supportedFormatsInfo line 1200
zh duplicate: aiCommandsError line 1203
zh duplicate: appTitle line 1204
zh duplicate: loginTitle line 1205
zh duplicate: loginDesc line 1206
zh duplicate: loginButton line 1207
zh duplicate: loginError line 1208
zh duplicate: unknownError line 1209
zh duplicate: usernamePlaceholder line 1210
zh duplicate: passwordPlaceholder line 1211
zh duplicate: registerButton line 1212
zh duplicate: langZh line 1213
zh duplicate: langEn line 1214
zh duplicate: langJa line 1215
zh duplicate: confirm line 1216
zh duplicate: cancel line 1217
zh duplicate: confirmTitle line 1218
zh duplicate: confirmDeleteGroup line 1219
zh duplicate: sidebarTitle line 1221
zh duplicate: backToWorkspace line 1222
zh duplicate: goToAdmin line 1223
zh duplicate: sidebarDesc line 1224
zh duplicate: tabFiles line 1225
zh duplicate: files line 1226
zh duplicate: notes line 1227
zh duplicate: tabSettings line 1228
zh duplicate: systemConfiguration line 1229
zh duplicate: noFiles line 1230
zh duplicate: noFilesDesc line 1231
zh duplicate: addFile line 1232
zh duplicate: clearAll line 1233
zh duplicate: uploading line 1234
zh duplicate: statusIndexing line 1235
zh duplicate: statusReady line 1236
zh duplicate: ragSettings line 1239
zh duplicate: enableRerank line 1240
zh duplicate: enableRerankDesc line 1241
zh duplicate: selectRerankModel line 1242
zh duplicate: selectModelPlaceholder line 1243
zh duplicate: headerModelSelection line 1245
zh duplicate: headerHyperparams line 1246
zh duplicate: headerIndexing line 1247
zh duplicate: headerRetrieval line 1248
zh duplicate: btnManageModels line 1249
zh duplicate: lblLLM line 1251
zh duplicate: lblEmbedding line 1252
zh duplicate: lblRerankRef line 1253
zh duplicate: lblTemperature line 1254
zh duplicate: lblMaxTokens line 1255
zh duplicate: lblChunkSize line 1256
zh duplicate: lblChunkOverlap line 1257
zh duplicate: lblTopK line 1258
zh duplicate: lblRerank line 1259
zh duplicate: idxModalTitle line 1261
zh duplicate: idxDesc line 1262
zh duplicate: idxFiles line 1263
zh duplicate: idxMethod line 1264
zh duplicate: idxEmbeddingModel line 1265
zh duplicate: idxStart line 1266
zh duplicate: idxCancel line 1267
zh duplicate: idxAuto line 1268
zh duplicate: idxCustom line 1269
zh duplicate: mmTitle line 1271
zh duplicate: mmAddBtn line 1272
zh duplicate: mmEdit line 1273
zh duplicate: mmDelete line 1274
zh duplicate: mmEmpty line 1275
zh duplicate: mmFormName line 1276
zh duplicate: mmFormProvider line 1277
zh duplicate: mmFormModelId line 1278
zh duplicate: mmFormBaseUrl line 1279
zh duplicate: mmFormType line 1280
zh duplicate: mmFormVision line 1281
zh duplicate: mmFormDimensions line 1282
zh duplicate: mmFormDimensionsHelp line 1283
zh duplicate: mmSave line 1284
zh duplicate: mmCancel line 1285
zh duplicate: mmErrorNotAuthenticated line 1286
zh duplicate: mmErrorTitle line 1287
zh duplicate: modelEnabled line 1288
zh duplicate: modelDisabled line 1289
zh duplicate: confirmChangeEmbeddingModel line 1290
zh duplicate: embeddingModelWarning line 1291
zh duplicate: sourcePreview line 1292
zh duplicate: matchScore line 1293
zh duplicate: copyContent line 1294
zh duplicate: copySuccess line 1295
zh duplicate: selectLLMModel line 1298
zh duplicate: selectEmbeddingModel line 1299
zh duplicate: defaultForUploads line 1300
zh duplicate: noRerankModel line 1301
zh duplicate: vectorSimilarityThreshold line 1302
zh duplicate: rerankSimilarityThreshold line 1303
zh duplicate: filterLowResults line 1304
zh duplicate: noteCreatedSuccess line 1305
zh duplicate: noteCreatedFailed line 1306
zh duplicate: fullTextSearch line 1307
zh duplicate: hybridVectorWeight line 1308
zh duplicate: hybridVectorWeightDesc line 1309
zh duplicate: lblQueryExpansion line 1310
zh duplicate: lblHyDE line 1311
zh duplicate: lblQueryExpansionDesc line 1312
zh duplicate: lblHyDEDesc line 1313
zh duplicate: apiKeyValidationFailed line 1315
zh duplicate: keepOriginalKey line 1316
zh duplicate: leaveEmptyNoChange line 1317
zh duplicate: mmFormApiKey line 1318
zh duplicate: mmFormApiKeyPlaceholder line 1319
zh duplicate: reconfigureFile line 1322
zh duplicate: modifySettings line 1323
zh duplicate: filesCount line 1324
zh duplicate: allFilesIndexed line 1325
zh duplicate: noEmbeddingModels line 1326
zh duplicate: reconfigure line 1327
zh duplicate: refresh line 1328
zh duplicate: settings line 1329
zh duplicate: needLogin line 1330
zh duplicate: citationSources line 1331
zh duplicate: chunkNumber line 1332
zh duplicate: getUserListFailed line 1333
zh duplicate: usernamePasswordRequired line 1334
zh duplicate: passwordMinLength line 1335
zh duplicate: userCreatedSuccess line 1336
zh duplicate: createUserFailed line 1337
zh duplicate: userPromotedToAdmin line 1338
zh duplicate: userDemotedFromAdmin line 1339
zh duplicate: updateUserFailed line 1340
zh duplicate: confirmDeleteUser line 1341
zh duplicate: deleteUser line 1342
zh duplicate: deleteUserFailed line 1343
zh duplicate: userDeletedSuccessfully line 1344
zh duplicate: makeUserAdmin line 1345
zh duplicate: makeUserRegular line 1346
zh duplicate: loading line 1347
zh duplicate: noUsers line 1348
zh duplicate: aiAssistant line 1351
zh duplicate: polishContent line 1352
zh duplicate: expandContent line 1353
zh duplicate: summarizeContent line 1354
zh duplicate: translateToEnglish line 1355
zh duplicate: fixGrammar line 1356
zh duplicate: aiCommandInstructPolish line 1357
zh duplicate: aiCommandInstructExpand line 1358
zh duplicate: aiCommandInstructSummarize line 1359
zh duplicate: aiCommandInstructTranslateToEn line 1360
zh duplicate: aiCommandInstructFixGrammar line 1361
zh duplicate: aiCommandsPreset line 1362
zh duplicate: aiCommandsCustom line 1363
zh duplicate: aiCommandsCustomPlaceholder line 1364
zh duplicate: aiCommandsReferenceContext line 1365
zh duplicate: aiCommandsStartGeneration line 1366
zh duplicate: aiCommandsResult line 1367
zh duplicate: aiCommandsGenerating line 1368
zh duplicate: aiCommandsApplyResult line 1369
zh duplicate: aiCommandsGoBack line 1370
zh duplicate: aiCommandsReset line 1371
zh duplicate: aiCommandsModalPreset line 1372
zh duplicate: aiCommandsModalCustom line 1373
zh duplicate: aiCommandsModalCustomPlaceholder line 1374
zh duplicate: aiCommandsModalBasedOnSelection line 1375
zh duplicate: aiCommandsModalResult line 1376
zh duplicate: aiCommandsModalApply line 1377
zh duplicate: fillAllFields line 1380
zh duplicate: passwordMismatch line 1381
zh duplicate: newPasswordMinLength line 1382
zh duplicate: changePasswordFailed line 1383
zh duplicate: changePasswordTitle line 1384
zh duplicate: changing line 1385
zh duplicate: searchResults line 1386
zh duplicate: visionModelSettings line 1389
zh duplicate: defaultVisionModel line 1390
zh duplicate: loadVisionModelFailed line 1391
zh duplicate: loadFailed line 1392
zh duplicate: saveVisionModelFailed line 1393
zh duplicate: noVisionModels line 1394
zh duplicate: selectVisionModel line 1395
zh duplicate: visionModelHelp line 1396
zh duplicate: mmErrorNameRequired line 1397
zh duplicate: mmErrorModelIdRequired line 1398
zh duplicate: mmErrorBaseUrlRequired line 1399
zh duplicate: mmRequiredAsterisk line 1400
zh duplicate: typeLLM line 1402
zh duplicate: typeEmbedding line 1403
zh duplicate: typeRerank line 1404
zh duplicate: typeVision line 1405
zh duplicate: welcome line 1407
zh duplicate: placeholderWithFiles line 1408
zh duplicate: placeholderEmpty line 1409
zh duplicate: analyzing line 1410
zh duplicate: errorGeneric line 1411
zh duplicate: errorLabel line 1412
zh duplicate: errorNoModel line 1413
zh duplicate: aiDisclaimer line 1414
zh duplicate: confirmClear line 1415
zh duplicate: removeFile line 1416
zh duplicate: apiError line 1417
zh duplicate: geminiError line 1418
zh duplicate: processedButNoText line 1419
zh duplicate: unitByte line 1420
zh duplicate: readingFailed line 1421
zh duplicate: copy line 1423
zh duplicate: copied line 1424
zh duplicate: logout line 1427
zh duplicate: changePassword line 1428
zh duplicate: userManagement line 1429
zh duplicate: userList line 1430
zh duplicate: addUser line 1431
zh duplicate: username line 1432
zh duplicate: password line 1433
zh duplicate: confirmPassword line 1434
zh duplicate: currentPassword line 1435
zh duplicate: newPassword line 1436
zh duplicate: createUser line 1437
zh duplicate: admin line 1438
zh duplicate: user line 1439
zh duplicate: adminUser line 1440
zh duplicate: confirmChange line 1441
zh duplicate: changeUserPassword line 1442
zh duplicate: enterNewPassword line 1443
zh duplicate: createdAt line 1444
zh duplicate: newChat line 1445
zh duplicate: kbManagement line 1448
zh duplicate: kbManagementDesc line 1449
zh duplicate: searchPlaceholder line 1450
zh duplicate: allGroups line 1451
zh duplicate: allStatus line 1452
zh duplicate: statusReadyFragment line 1453
zh duplicate: statusFailedFragment line 1454
zh duplicate: statusIndexingFragment line 1455
zh duplicate: uploadFile line 1456
zh duplicate: fileName line 1457
zh duplicate: size line 1458
zh duplicate: status line 1459
zh duplicate: groups line 1460
zh duplicate: actions line 1461
zh duplicate: groupsActions line 1462
zh duplicate: noFilesFound line 1463
zh duplicate: showingRange line 1464
zh duplicate: confirmDeleteFile line 1465
zh duplicate: fileDeleted line 1466
zh duplicate: deleteFailed line 1467
zh duplicate: fileAddedToGroup line 1468
zh duplicate: failedToAddToGroup line 1469
zh duplicate: fileRemovedFromGroup line 1470
zh duplicate: failedToRemoveFromGroup line 1471
zh duplicate: confirmClearKB line 1472
zh duplicate: kbCleared line 1473
zh duplicate: clearFailed line 1474
zh duplicate: loginRequired line 1475
zh duplicate: uploadErrors line 1476
zh duplicate: uploadWarning line 1477
zh duplicate: uploadFailed line 1478
zh duplicate: preview line 1479
zh duplicate: addGroup line 1480
zh duplicate: delete line 1481
zh duplicate: retry line 1482
zh duplicate: retrying line 1483
zh duplicate: retrySuccess line 1484
zh duplicate: retryFailed line 1485
zh duplicate: chunkInfo line 1486
zh duplicate: totalChunks line 1487
zh duplicate: chunkIndex line 1488
zh duplicate: contentLength line 1489
zh duplicate: position line 1490
zh duplicate: reconfigureTitle line 1493
zh duplicate: reconfigureDesc line 1494
zh duplicate: indexingConfigTitle line 1495
zh duplicate: indexingConfigDesc line 1496
zh duplicate: pendingFiles line 1497
zh duplicate: processingMode line 1498
zh duplicate: analyzingFile line 1499
zh duplicate: recommendationReason line 1500
zh duplicate: fastMode line 1501
zh duplicate: fastModeDesc line 1502
zh duplicate: preciseMode line 1503
zh duplicate: preciseModeDesc line 1504
zh duplicate: fastModeFeatures line 1505
zh duplicate: fastFeature1 line 1506
zh duplicate: fastFeature2 line 1507
zh duplicate: fastFeature3 line 1508
zh duplicate: fastFeature4 line 1509
zh duplicate: fastFeature5 line 1510
zh duplicate: preciseModeFeatures line 1511
zh duplicate: preciseFeature1 line 1512
zh duplicate: preciseFeature2 line 1513
zh duplicate: preciseFeature3 line 1514
zh duplicate: preciseFeature4 line 1515
zh duplicate: preciseFeature5 line 1516
zh duplicate: preciseFeature6 line 1517
zh duplicate: embeddingModel line 1518
zh duplicate: pleaseSelect line 1519
zh duplicate: pleaseSelectKnowledgeGroupFirst line 1520
zh duplicate: selectUnassignGroupWarning line 1521
zh duplicate: chunkConfig line 1522
zh duplicate: chunkSize line 1523
zh duplicate: min line 1524
zh duplicate: max line 1525
zh duplicate: chunkOverlap line 1526
zh duplicate: modelLimitsInfo line 1527
zh duplicate: model line 1528
zh duplicate: maxChunkSize line 1529
zh duplicate: maxOverlapSize line 1530
zh duplicate: maxBatchSize line 1531
zh duplicate: envLimitWeaker line 1532
zh duplicate: optimizationTips line 1533
zh duplicate: tipChunkTooLarge line 1534
zh duplicate: tipOverlapSmall line 1535
zh duplicate: tipMaxValues line 1536
zh duplicate: tipPreciseCost line 1537
zh duplicate: selectEmbeddingFirst line 1538
zh duplicate: confirmPreciseCost line 1539
zh duplicate: startProcessing line 1540
zh duplicate: notebooks line 1543
zh duplicate: notebooksDesc line 1544
zh duplicate: createNotebook line 1545
zh duplicate: chatWithNotebook line 1546
zh duplicate: editNotebook line 1547
zh duplicate: deleteNotebook line 1548
zh duplicate: noDescription line 1549
zh duplicate: hasIntro line 1550
zh duplicate: noIntro line 1551
zh duplicate: noNotebooks line 1552
zh duplicate: createFailed line 1553
zh duplicate: confirmDeleteNotebook line 1554
zh duplicate: errorFileTooLarge line 1557
zh duplicate: noFilesYet line 1558
zh duplicate: createNotebookTitle line 1561
zh duplicate: editNotebookTitle line 1562
zh duplicate: createFailedRetry line 1563
zh duplicate: updateFailedRetry line 1564
zh duplicate: name line 1565
zh duplicate: nameHelp line 1566
zh duplicate: namePlaceholder line 1567
zh duplicate: shortDescription line 1568
zh duplicate: descPlaceholder line 1569
zh duplicate: detailedIntro line 1570
zh duplicate: introPlaceholder line 1571
zh duplicate: introHelp line 1572
zh duplicate: creating line 1573
zh duplicate: createNow line 1574
zh duplicate: saving line 1575
zh duplicate: save line 1576
zh duplicate: chatTitle line 1579
zh duplicate: chatDesc line 1580
zh duplicate: viewHistory line 1581
zh duplicate: saveSettingsFailed line 1582
zh duplicate: loginToUpload line 1583
zh duplicate: fileSizeLimitExceeded line 1584
zh duplicate: unsupportedFileType line 1585
zh duplicate: readFailed line 1586
zh duplicate: loadHistoryFailed line 1587
zh duplicate: loadingUserData line 1588
zh duplicate: errorMessage line 1589
zh duplicate: welcomeMessage line 1590
zh duplicate: selectKnowledgeGroup line 1591
zh duplicate: allKnowledgeGroups line 1592
zh duplicate: unknownGroup line 1593
zh duplicate: selectedGroupsCount line 1594
zh duplicate: generalSettings line 1597
zh duplicate: modelManagement line 1598
zh duplicate: languageSettings line 1599
zh duplicate: passwordChangeSuccess line 1600
zh duplicate: passwordChangeFailed line 1601
zh duplicate: create line 1602
zh duplicate: validationFailedMsg line 1603
zh duplicate: navChat line 1607
zh duplicate: navCoach line 1608
zh duplicate: navKnowledge line 1609
zh duplicate: navKnowledgeGroups line 1610
zh duplicate: navCrawler line 1611
zh duplicate: expandMenu line 1612
zh duplicate: switchLanguage line 1613
zh duplicate: selectKnowledgeGroups line 1616
zh duplicate: searchGroupsPlaceholder line 1617
zh duplicate: done line 1618
zh duplicate: all line 1619
zh duplicate: noGroupsFound line 1620
zh duplicate: noGroups line 1621
zh duplicate: autoRefresh line 1624
zh duplicate: refreshInterval line 1625
zh duplicate: errorRenderFlowchart line 1628
zh duplicate: errorLoadData line 1629
zh duplicate: confirmUnsupportedFile line 1630
zh duplicate: errorReadFile line 1631
zh duplicate: successUploadFile line 1632
zh duplicate: errorUploadFile line 1633
zh duplicate: errorProcessFile line 1634
zh duplicate: errorTitleContentRequired line 1635
zh duplicate: successNoteUpdated line 1636
zh duplicate: successNoteCreated line 1637
zh duplicate: errorSaveFailed line 1638
zh duplicate: confirmDeleteNote line 1639
zh duplicate: successNoteDeleted line 1640
zh duplicate: confirmRemoveFileFromGroup line 1641
zh duplicate: editNote line 1642
zh duplicate: newNote line 1643
zh duplicate: togglePreviewOpen line 1644
zh duplicate: togglePreviewClose line 1645
zh duplicate: noteTitlePlaceholder line 1646
zh duplicate: noteContentPlaceholder line 1647
zh duplicate: markdownPreviewArea line 1648
zh duplicate: back line 1649
zh duplicate: chatWithGroup line 1650
zh duplicate: chatWithFile line 1651
zh duplicate: filesCountLabel line 1652
zh duplicate: notesCountLabel line 1653
zh duplicate: indexIntoKB line 1654
zh duplicate: noFilesOrNotes line 1655
zh duplicate: importFolder line 1656
zh duplicate: createPDFNote line 1659
zh duplicate: screenshotPreview line 1660
zh duplicate: associateKnowledgeGroup line 1661
zh duplicate: globalNoSpecificGroup line 1662
zh duplicate: title line 1663
zh duplicate: enterNoteTitle line 1664
zh duplicate: contentOCR line 1665
zh duplicate: extractingText line 1666
zh duplicate: analyzingImage line 1667
zh duplicate: noTextExtracted line 1668
zh duplicate: saveNote line 1669
zh duplicate: page line 1672
zh duplicate: placeholderText line 1673
zh duplicate: createNewNotebook line 1676
zh duplicate: nameField line 1677
zh duplicate: required line 1678
zh duplicate: exampleResearch line 1679
zh duplicate: shortDescriptionField line 1680
zh duplicate: describePurpose line 1681
zh duplicate: detailedIntroField line 1682
zh duplicate: provideBackgroundInfo line 1683
zh duplicate: creationFailed line 1684
zh duplicate: preparingPDFConversion line 1687
zh duplicate: pleaseWait line 1688
zh duplicate: convertingPDF line 1689
zh duplicate: pdfConversionFailed line 1690
zh duplicate: pdfConversionError line 1691
zh duplicate: pdfLoadFailed line 1692
zh duplicate: pdfLoadError line 1693
zh duplicate: downloadingPDF line 1694
zh duplicate: loadingPDF line 1695
zh duplicate: zoomOut line 1696
zh duplicate: zoomIn line 1697
zh duplicate: resetZoom line 1698
zh duplicate: selectPageNumber line 1699
zh duplicate: enterPageNumber line 1700
zh duplicate: exitSelectionMode line 1701
zh duplicate: clickToSelectAndNote line 1702
zh duplicate: regeneratePDF line 1703
zh duplicate: downloadPDF line 1704
zh duplicate: openInNewWindow line 1705
zh duplicate: exitFullscreen line 1706
zh duplicate: fullscreenDisplay line 1707
zh duplicate: pdfPreview line 1708
zh duplicate: converting line 1709
zh duplicate: generatePDFPreview line 1710
zh duplicate: previewNotSupported line 1711
zh duplicate: confirmRegeneratePDF line 1714
zh duplicate: pdfPreviewReady line 1717
zh duplicate: convertingInProgress line 1718
zh duplicate: conversionFailed line 1719
zh duplicate: generatePDFPreviewButton line 1720
zh duplicate: checkPDFStatusFailed line 1723
zh duplicate: requestRegenerationFailed line 1724
zh duplicate: downloadPDFFailed line 1725
zh duplicate: openPDFInNewTabFailed line 1726
zh duplicate: invalidFile line 1729
zh duplicate: incompleteFileInfo line 1730
zh duplicate: unsupportedFileFormat line 1731
zh duplicate: willUseFastMode line 1732
zh duplicate: formatNoPrecise line 1733
zh duplicate: smallFileFastOk line 1734
zh duplicate: mixedContentPreciseRecommended line 1735
zh duplicate: willIncurApiCost line 1736
zh duplicate: largeFilePreciseRecommended line 1737
zh duplicate: longProcessingTime line 1738
zh duplicate: highApiCost line 1739
zh duplicate: considerFileSplitting line 1740
zh duplicate: dragDropUploadTitle line 1743
zh duplicate: dragDropUploadDesc line 1744
zh duplicate: supportedFormats line 1745
zh duplicate: browseFiles line 1746
zh duplicate: recommendationMsg line 1749
zh duplicate: autoAdjustChunk line 1750
zh duplicate: autoAdjustOverlap line 1751
zh duplicate: autoAdjustOverlapMin line 1752
zh duplicate: loadLimitsFailed line 1753
zh duplicate: maxValueMsg line 1754
zh duplicate: overlapRatioLimit line 1755
zh duplicate: onlyAdminCanModify line 1756
zh duplicate: dragToSelect line 1757
zh duplicate: fillTargetName line 1760
zh duplicate: submitFailed line 1761
zh duplicate: importFolderTitle line 1762
zh duplicate: importFolderTip line 1763
zh duplicate: lblTargetGroup line 1764
zh duplicate: placeholderNewGroup line 1765
zh duplicate: importToCurrentGroup line 1766
zh duplicate: nextStep line 1767
zh duplicate: lblImportSource line 1768
zh duplicate: serverPath line 1769
zh duplicate: localFolder line 1770
zh duplicate: selectedFilesCount line 1771
zh duplicate: clickToSelectFolder line 1772
zh duplicate: selectFolderTip line 1773
zh duplicate: importComplete line 1774
zh duplicate: importedFromLocalFolder line 1775
zh duplicate: historyTitle line 1778
zh duplicate: confirmDeleteHistory line 1779
zh duplicate: deleteHistorySuccess line 1780
zh duplicate: deleteHistoryFailed line 1781
zh duplicate: yesterday line 1782
zh duplicate: daysAgo line 1783
zh duplicate: historyMessages line 1784
zh duplicate: noHistory line 1785
zh duplicate: noHistoryDesc line 1786
zh duplicate: loadMore line 1787
zh duplicate: loadingHistoriesFailed line 1788
zh duplicate: supportedFormatsInfo line 1789
en duplicate: aiCommandsError line 1203
en duplicate: appTitle line 1204
en duplicate: loginTitle line 1205
en duplicate: loginDesc line 1206
en duplicate: loginButton line 1207
en duplicate: loginError line 1208
en duplicate: unknownError line 1209
en duplicate: usernamePlaceholder line 1210
en duplicate: passwordPlaceholder line 1211
en duplicate: registerButton line 1212
en duplicate: langZh line 1213
en duplicate: langEn line 1214
en duplicate: langJa line 1215
en duplicate: confirm line 1216
en duplicate: cancel line 1217
en duplicate: confirmTitle line 1218
en duplicate: confirmDeleteGroup line 1219
en duplicate: sidebarTitle line 1221
en duplicate: backToWorkspace line 1222
en duplicate: goToAdmin line 1223
en duplicate: sidebarDesc line 1224
en duplicate: tabFiles line 1225
en duplicate: files line 1226
en duplicate: notes line 1227
en duplicate: tabSettings line 1228
en duplicate: systemConfiguration line 1229
en duplicate: noFiles line 1230
en duplicate: noFilesDesc line 1231
en duplicate: addFile line 1232
en duplicate: clearAll line 1233
en duplicate: uploading line 1234
en duplicate: statusIndexing line 1235
en duplicate: statusReady line 1236
en duplicate: ragSettings line 1239
en duplicate: enableRerank line 1240
en duplicate: enableRerankDesc line 1241
en duplicate: selectRerankModel line 1242
en duplicate: selectModelPlaceholder line 1243
en duplicate: headerModelSelection line 1245
en duplicate: headerHyperparams line 1246
en duplicate: headerIndexing line 1247
en duplicate: headerRetrieval line 1248
en duplicate: btnManageModels line 1249
en duplicate: lblLLM line 1251
en duplicate: lblEmbedding line 1252
en duplicate: lblRerankRef line 1253
en duplicate: lblTemperature line 1254
en duplicate: lblMaxTokens line 1255
en duplicate: lblChunkSize line 1256
en duplicate: lblChunkOverlap line 1257
en duplicate: lblTopK line 1258
en duplicate: lblRerank line 1259
en duplicate: idxModalTitle line 1261
en duplicate: idxDesc line 1262
en duplicate: idxFiles line 1263
en duplicate: idxMethod line 1264
en duplicate: idxEmbeddingModel line 1265
en duplicate: idxStart line 1266
en duplicate: idxCancel line 1267
en duplicate: idxAuto line 1268
en duplicate: idxCustom line 1269
en duplicate: mmTitle line 1271
en duplicate: mmAddBtn line 1272
en duplicate: mmEdit line 1273
en duplicate: mmDelete line 1274
en duplicate: mmEmpty line 1275
en duplicate: mmFormName line 1276
en duplicate: mmFormProvider line 1277
en duplicate: mmFormModelId line 1278
en duplicate: mmFormBaseUrl line 1279
en duplicate: mmFormType line 1280
en duplicate: mmFormVision line 1281
en duplicate: mmFormDimensions line 1282
en duplicate: mmFormDimensionsHelp line 1283
en duplicate: mmSave line 1284
en duplicate: mmCancel line 1285
en duplicate: mmErrorNotAuthenticated line 1286
en duplicate: mmErrorTitle line 1287
en duplicate: modelEnabled line 1288
en duplicate: modelDisabled line 1289
en duplicate: confirmChangeEmbeddingModel line 1290
en duplicate: embeddingModelWarning line 1291
en duplicate: sourcePreview line 1292
en duplicate: matchScore line 1293
en duplicate: copyContent line 1294
en duplicate: copySuccess line 1295
en duplicate: selectLLMModel line 1298
en duplicate: selectEmbeddingModel line 1299
en duplicate: defaultForUploads line 1300
en duplicate: noRerankModel line 1301
en duplicate: vectorSimilarityThreshold line 1302
en duplicate: rerankSimilarityThreshold line 1303
en duplicate: filterLowResults line 1304
en duplicate: noteCreatedSuccess line 1305
en duplicate: noteCreatedFailed line 1306
en duplicate: fullTextSearch line 1307
en duplicate: hybridVectorWeight line 1308
en duplicate: hybridVectorWeightDesc line 1309
en duplicate: lblQueryExpansion line 1310
en duplicate: lblHyDE line 1311
en duplicate: lblQueryExpansionDesc line 1312
en duplicate: lblHyDEDesc line 1313
en duplicate: apiKeyValidationFailed line 1315
en duplicate: keepOriginalKey line 1316
en duplicate: leaveEmptyNoChange line 1317
en duplicate: mmFormApiKey line 1318
en duplicate: mmFormApiKeyPlaceholder line 1319
en duplicate: reconfigureFile line 1322
en duplicate: modifySettings line 1323
en duplicate: filesCount line 1324
en duplicate: allFilesIndexed line 1325
en duplicate: noEmbeddingModels line 1326
en duplicate: reconfigure line 1327
en duplicate: refresh line 1328
en duplicate: settings line 1329
en duplicate: needLogin line 1330
en duplicate: citationSources line 1331
en duplicate: chunkNumber line 1332
en duplicate: getUserListFailed line 1333
en duplicate: usernamePasswordRequired line 1334
en duplicate: passwordMinLength line 1335
en duplicate: userCreatedSuccess line 1336
en duplicate: createUserFailed line 1337
en duplicate: userPromotedToAdmin line 1338
en duplicate: userDemotedFromAdmin line 1339
en duplicate: updateUserFailed line 1340
en duplicate: confirmDeleteUser line 1341
en duplicate: deleteUser line 1342
en duplicate: deleteUserFailed line 1343
en duplicate: userDeletedSuccessfully line 1344
en duplicate: makeUserAdmin line 1345
en duplicate: makeUserRegular line 1346
en duplicate: loading line 1347
en duplicate: noUsers line 1348
en duplicate: aiAssistant line 1351
en duplicate: polishContent line 1352
en duplicate: expandContent line 1353
en duplicate: summarizeContent line 1354
en duplicate: translateToEnglish line 1355
en duplicate: fixGrammar line 1356
en duplicate: aiCommandInstructPolish line 1357
en duplicate: aiCommandInstructExpand line 1358
en duplicate: aiCommandInstructSummarize line 1359
en duplicate: aiCommandInstructTranslateToEn line 1360
en duplicate: aiCommandInstructFixGrammar line 1361
en duplicate: aiCommandsPreset line 1362
en duplicate: aiCommandsCustom line 1363
en duplicate: aiCommandsCustomPlaceholder line 1364
en duplicate: aiCommandsReferenceContext line 1365
en duplicate: aiCommandsStartGeneration line 1366
en duplicate: aiCommandsResult line 1367
en duplicate: aiCommandsGenerating line 1368
en duplicate: aiCommandsApplyResult line 1369
en duplicate: aiCommandsGoBack line 1370
en duplicate: aiCommandsReset line 1371
en duplicate: aiCommandsModalPreset line 1372
en duplicate: aiCommandsModalCustom line 1373
en duplicate: aiCommandsModalCustomPlaceholder line 1374
en duplicate: aiCommandsModalBasedOnSelection line 1375
en duplicate: aiCommandsModalResult line 1376
en duplicate: aiCommandsModalApply line 1377
en duplicate: fillAllFields line 1380
en duplicate: passwordMismatch line 1381
en duplicate: newPasswordMinLength line 1382
en duplicate: changePasswordFailed line 1383
en duplicate: changePasswordTitle line 1384
en duplicate: changing line 1385
en duplicate: searchResults line 1386
en duplicate: visionModelSettings line 1389
en duplicate: defaultVisionModel line 1390
en duplicate: loadVisionModelFailed line 1391
en duplicate: loadFailed line 1392
en duplicate: saveVisionModelFailed line 1393
en duplicate: noVisionModels line 1394
en duplicate: selectVisionModel line 1395
en duplicate: visionModelHelp line 1396
en duplicate: mmErrorNameRequired line 1397
en duplicate: mmErrorModelIdRequired line 1398
en duplicate: mmErrorBaseUrlRequired line 1399
en duplicate: mmRequiredAsterisk line 1400
en duplicate: typeLLM line 1402
en duplicate: typeEmbedding line 1403
en duplicate: typeRerank line 1404
en duplicate: typeVision line 1405
en duplicate: welcome line 1407
en duplicate: placeholderWithFiles line 1408
en duplicate: placeholderEmpty line 1409
en duplicate: analyzing line 1410
en duplicate: errorGeneric line 1411
en duplicate: errorLabel line 1412
en duplicate: errorNoModel line 1413
en duplicate: aiDisclaimer line 1414
en duplicate: confirmClear line 1415
en duplicate: removeFile line 1416
en duplicate: apiError line 1417
en duplicate: geminiError line 1418
en duplicate: processedButNoText line 1419
en duplicate: unitByte line 1420
en duplicate: readingFailed line 1421
en duplicate: copy line 1423
en duplicate: copied line 1424
en duplicate: logout line 1427
en duplicate: changePassword line 1428
en duplicate: userManagement line 1429
en duplicate: userList line 1430
en duplicate: addUser line 1431
en duplicate: username line 1432
en duplicate: password line 1433
en duplicate: confirmPassword line 1434
en duplicate: currentPassword line 1435
en duplicate: newPassword line 1436
en duplicate: createUser line 1437
en duplicate: admin line 1438
en duplicate: user line 1439
en duplicate: adminUser line 1440
en duplicate: confirmChange line 1441
en duplicate: changeUserPassword line 1442
en duplicate: enterNewPassword line 1443
en duplicate: createdAt line 1444
en duplicate: newChat line 1445
en duplicate: kbManagement line 1448
en duplicate: kbManagementDesc line 1449
en duplicate: searchPlaceholder line 1450
en duplicate: allGroups line 1451
en duplicate: allStatus line 1452
en duplicate: statusReadyFragment line 1453
en duplicate: statusFailedFragment line 1454
en duplicate: statusIndexingFragment line 1455
en duplicate: uploadFile line 1456
en duplicate: fileName line 1457
en duplicate: size line 1458
en duplicate: status line 1459
en duplicate: groups line 1460
en duplicate: actions line 1461
en duplicate: groupsActions line 1462
en duplicate: noFilesFound line 1463
en duplicate: showingRange line 1464
en duplicate: confirmDeleteFile line 1465
en duplicate: fileDeleted line 1466
en duplicate: deleteFailed line 1467
en duplicate: fileAddedToGroup line 1468
en duplicate: failedToAddToGroup line 1469
en duplicate: fileRemovedFromGroup line 1470
en duplicate: failedToRemoveFromGroup line 1471
en duplicate: confirmClearKB line 1472
en duplicate: kbCleared line 1473
en duplicate: clearFailed line 1474
en duplicate: loginRequired line 1475
en duplicate: uploadErrors line 1476
en duplicate: uploadWarning line 1477
en duplicate: uploadFailed line 1478
en duplicate: preview line 1479
en duplicate: addGroup line 1480
en duplicate: delete line 1481
en duplicate: retry line 1482
en duplicate: retrying line 1483
en duplicate: retrySuccess line 1484
en duplicate: retryFailed line 1485
en duplicate: chunkInfo line 1486
en duplicate: totalChunks line 1487
en duplicate: chunkIndex line 1488
en duplicate: contentLength line 1489
en duplicate: position line 1490
en duplicate: reconfigureTitle line 1493
en duplicate: reconfigureDesc line 1494
en duplicate: indexingConfigTitle line 1495
en duplicate: indexingConfigDesc line 1496
en duplicate: pendingFiles line 1497
en duplicate: processingMode line 1498
en duplicate: analyzingFile line 1499
en duplicate: recommendationReason line 1500
en duplicate: fastMode line 1501
en duplicate: fastModeDesc line 1502
en duplicate: preciseMode line 1503
en duplicate: preciseModeDesc line 1504
en duplicate: fastModeFeatures line 1505
en duplicate: fastFeature1 line 1506
en duplicate: fastFeature2 line 1507
en duplicate: fastFeature3 line 1508
en duplicate: fastFeature4 line 1509
en duplicate: fastFeature5 line 1510
en duplicate: preciseModeFeatures line 1511
en duplicate: preciseFeature1 line 1512
en duplicate: preciseFeature2 line 1513
en duplicate: preciseFeature3 line 1514
en duplicate: preciseFeature4 line 1515
en duplicate: preciseFeature5 line 1516
en duplicate: preciseFeature6 line 1517
en duplicate: embeddingModel line 1518
en duplicate: pleaseSelect line 1519
en duplicate: pleaseSelectKnowledgeGroupFirst line 1520
en duplicate: selectUnassignGroupWarning line 1521
en duplicate: chunkConfig line 1522
en duplicate: chunkSize line 1523
en duplicate: min line 1524
en duplicate: max line 1525
en duplicate: chunkOverlap line 1526
en duplicate: modelLimitsInfo line 1527
en duplicate: model line 1528
en duplicate: maxChunkSize line 1529
en duplicate: maxOverlapSize line 1530
en duplicate: maxBatchSize line 1531
en duplicate: envLimitWeaker line 1532
en duplicate: optimizationTips line 1533
en duplicate: tipChunkTooLarge line 1534
en duplicate: tipOverlapSmall line 1535
en duplicate: tipMaxValues line 1536
en duplicate: tipPreciseCost line 1537
en duplicate: selectEmbeddingFirst line 1538
en duplicate: confirmPreciseCost line 1539
en duplicate: startProcessing line 1540
en duplicate: notebooks line 1543
en duplicate: notebooksDesc line 1544
en duplicate: createNotebook line 1545
en duplicate: chatWithNotebook line 1546
en duplicate: editNotebook line 1547
en duplicate: deleteNotebook line 1548
en duplicate: noDescription line 1549
en duplicate: hasIntro line 1550
en duplicate: noIntro line 1551
en duplicate: noNotebooks line 1552
en duplicate: createFailed line 1553
en duplicate: confirmDeleteNotebook line 1554
en duplicate: errorFileTooLarge line 1557
en duplicate: noFilesYet line 1558
en duplicate: createNotebookTitle line 1561
en duplicate: editNotebookTitle line 1562
en duplicate: createFailedRetry line 1563
en duplicate: updateFailedRetry line 1564
en duplicate: name line 1565
en duplicate: nameHelp line 1566
en duplicate: namePlaceholder line 1567
en duplicate: shortDescription line 1568
en duplicate: descPlaceholder line 1569
en duplicate: detailedIntro line 1570
en duplicate: introPlaceholder line 1571
en duplicate: introHelp line 1572
en duplicate: creating line 1573
en duplicate: createNow line 1574
en duplicate: saving line 1575
en duplicate: save line 1576
en duplicate: chatTitle line 1579
en duplicate: chatDesc line 1580
en duplicate: viewHistory line 1581
en duplicate: saveSettingsFailed line 1582
en duplicate: loginToUpload line 1583
en duplicate: fileSizeLimitExceeded line 1584
en duplicate: unsupportedFileType line 1585
en duplicate: readFailed line 1586
en duplicate: loadHistoryFailed line 1587
en duplicate: loadingUserData line 1588
en duplicate: errorMessage line 1589
en duplicate: welcomeMessage line 1590
en duplicate: selectKnowledgeGroup line 1591
en duplicate: allKnowledgeGroups line 1592
en duplicate: unknownGroup line 1593
en duplicate: selectedGroupsCount line 1594
en duplicate: generalSettings line 1597
en duplicate: modelManagement line 1598
en duplicate: languageSettings line 1599
en duplicate: passwordChangeSuccess line 1600
en duplicate: passwordChangeFailed line 1601
en duplicate: create line 1602
en duplicate: validationFailedMsg line 1603
en duplicate: navChat line 1607
en duplicate: navCoach line 1608
en duplicate: navKnowledge line 1609
en duplicate: navKnowledgeGroups line 1610
en duplicate: navCrawler line 1611
en duplicate: expandMenu line 1612
en duplicate: switchLanguage line 1613
en duplicate: selectKnowledgeGroups line 1616
en duplicate: searchGroupsPlaceholder line 1617
en duplicate: done line 1618
en duplicate: all line 1619
en duplicate: noGroupsFound line 1620
en duplicate: noGroups line 1621
en duplicate: autoRefresh line 1624
en duplicate: refreshInterval line 1625
en duplicate: errorRenderFlowchart line 1628
en duplicate: errorLoadData line 1629
en duplicate: confirmUnsupportedFile line 1630
en duplicate: errorReadFile line 1631
en duplicate: successUploadFile line 1632
en duplicate: errorUploadFile line 1633
en duplicate: errorProcessFile line 1634
en duplicate: errorTitleContentRequired line 1635
en duplicate: successNoteUpdated line 1636
en duplicate: successNoteCreated line 1637
en duplicate: errorSaveFailed line 1638
en duplicate: confirmDeleteNote line 1639
en duplicate: successNoteDeleted line 1640
en duplicate: confirmRemoveFileFromGroup line 1641
en duplicate: editNote line 1642
en duplicate: newNote line 1643
en duplicate: togglePreviewOpen line 1644
en duplicate: togglePreviewClose line 1645
en duplicate: noteTitlePlaceholder line 1646
en duplicate: noteContentPlaceholder line 1647
en duplicate: markdownPreviewArea line 1648
en duplicate: back line 1649
en duplicate: chatWithGroup line 1650
en duplicate: chatWithFile line 1651
en duplicate: filesCountLabel line 1652
en duplicate: notesCountLabel line 1653
en duplicate: indexIntoKB line 1654
en duplicate: noFilesOrNotes line 1655
en duplicate: importFolder line 1656
en duplicate: createPDFNote line 1659
en duplicate: screenshotPreview line 1660
en duplicate: associateKnowledgeGroup line 1661
en duplicate: globalNoSpecificGroup line 1662
en duplicate: title line 1663
en duplicate: enterNoteTitle line 1664
en duplicate: contentOCR line 1665
en duplicate: extractingText line 1666
en duplicate: analyzingImage line 1667
en duplicate: noTextExtracted line 1668
en duplicate: saveNote line 1669
en duplicate: page line 1672
en duplicate: placeholderText line 1673
en duplicate: createNewNotebook line 1676
en duplicate: nameField line 1677
en duplicate: required line 1678
en duplicate: exampleResearch line 1679
en duplicate: shortDescriptionField line 1680
en duplicate: describePurpose line 1681
en duplicate: detailedIntroField line 1682
en duplicate: provideBackgroundInfo line 1683
en duplicate: creationFailed line 1684
en duplicate: preparingPDFConversion line 1687
en duplicate: pleaseWait line 1688
en duplicate: convertingPDF line 1689
en duplicate: pdfConversionFailed line 1690
en duplicate: pdfConversionError line 1691
en duplicate: pdfLoadFailed line 1692
en duplicate: pdfLoadError line 1693
en duplicate: downloadingPDF line 1694
en duplicate: loadingPDF line 1695
en duplicate: zoomOut line 1696
en duplicate: zoomIn line 1697
en duplicate: resetZoom line 1698
en duplicate: selectPageNumber line 1699
en duplicate: enterPageNumber line 1700
en duplicate: exitSelectionMode line 1701
en duplicate: clickToSelectAndNote line 1702
en duplicate: regeneratePDF line 1703
en duplicate: downloadPDF line 1704
en duplicate: openInNewWindow line 1705
en duplicate: exitFullscreen line 1706
en duplicate: fullscreenDisplay line 1707
en duplicate: pdfPreview line 1708
en duplicate: converting line 1709
en duplicate: generatePDFPreview line 1710
en duplicate: previewNotSupported line 1711
en duplicate: confirmRegeneratePDF line 1714
en duplicate: pdfPreviewReady line 1717
en duplicate: convertingInProgress line 1718
en duplicate: conversionFailed line 1719
en duplicate: generatePDFPreviewButton line 1720
en duplicate: checkPDFStatusFailed line 1723
en duplicate: requestRegenerationFailed line 1724
en duplicate: downloadPDFFailed line 1725
en duplicate: openPDFInNewTabFailed line 1726
en duplicate: invalidFile line 1729
en duplicate: incompleteFileInfo line 1730
en duplicate: unsupportedFileFormat line 1731
en duplicate: willUseFastMode line 1732
en duplicate: formatNoPrecise line 1733
en duplicate: smallFileFastOk line 1734
en duplicate: mixedContentPreciseRecommended line 1735
en duplicate: willIncurApiCost line 1736
en duplicate: largeFilePreciseRecommended line 1737
en duplicate: longProcessingTime line 1738
en duplicate: highApiCost line 1739
en duplicate: considerFileSplitting line 1740
en duplicate: dragDropUploadTitle line 1743
en duplicate: dragDropUploadDesc line 1744
en duplicate: supportedFormats line 1745
en duplicate: browseFiles line 1746
en duplicate: recommendationMsg line 1749
en duplicate: autoAdjustChunk line 1750
en duplicate: autoAdjustOverlap line 1751
en duplicate: autoAdjustOverlapMin line 1752
en duplicate: loadLimitsFailed line 1753
en duplicate: maxValueMsg line 1754
en duplicate: overlapRatioLimit line 1755
en duplicate: onlyAdminCanModify line 1756
en duplicate: dragToSelect line 1757
en duplicate: fillTargetName line 1760
en duplicate: submitFailed line 1761
en duplicate: importFolderTitle line 1762
en duplicate: importFolderTip line 1763
en duplicate: lblTargetGroup line 1764
en duplicate: placeholderNewGroup line 1765
en duplicate: importToCurrentGroup line 1766
en duplicate: nextStep line 1767
en duplicate: lblImportSource line 1768
en duplicate: serverPath line 1769
en duplicate: localFolder line 1770
en duplicate: selectedFilesCount line 1771
en duplicate: clickToSelectFolder line 1772
en duplicate: selectFolderTip line 1773
en duplicate: importComplete line 1774
en duplicate: importedFromLocalFolder line 1775
en duplicate: historyTitle line 1778
en duplicate: confirmDeleteHistory line 1779
en duplicate: deleteHistorySuccess line 1780
en duplicate: deleteHistoryFailed line 1781
en duplicate: yesterday line 1782
en duplicate: daysAgo line 1783
en duplicate: historyMessages line 1784
en duplicate: noHistory line 1785
en duplicate: noHistoryDesc line 1786
en duplicate: loadMore line 1787
en duplicate: loadingHistoriesFailed line 1788
en duplicate: supportedFormatsInfo line 1789
+1
View File
@@ -13,6 +13,7 @@
"concurrently": "^8.2.2"
},
"dependencies": {
"@playwright/test": "^1.61.0",
"playwright": "^1.60.0"
}
}
-11
View File
@@ -1,11 +0,0 @@
const Database = require('better-sqlite3');
const db = new Database('d:/workspace/AuraK/server/data/metadata.db');
try {
const columns = db.prepare('PRAGMA table_info(assessment_sessions)').all();
console.log(columns.map(c => c.name));
} catch (e) {
console.error(e);
} finally {
db.close();
}
-16
View File
@@ -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();
}
-4
View File
@@ -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
BIN
View File
Binary file not shown.
-1
View File
@@ -1 +0,0 @@
CREATE TABLE IF NOT EXISTS "assessment_templates" ("id" varchar PRIMARY KEY NOT NULL, "tenant_id" varchar, "name" varchar NOT NULL, "description" text, "keywords" text, "question_count" integer NOT NULL DEFAULT (5), "difficulty_distribution" text, "style" varchar NOT NULL DEFAULT ('technical'), "knowledge_base_id" varchar, "knowledge_group_id" varchar, "is_active" boolean NOT NULL DEFAULT (1), "version" integer NOT NULL DEFAULT (1), "created_by" varchar, "created_at" datetime NOT NULL DEFAULT (datetime('now')), "updated_at" datetime NOT NULL DEFAULT (datetime('now')), CONSTRAINT "FK_cc65bf036f86297666e8c6d81da" FOREIGN KEY ("tenant_id") REFERENCES "tenants" ("id") ON DELETE CASCADE ON UPDATE NO ACTION, CONSTRAINT "FK_82bfee03c2fcb339451261853a3" FOREIGN KEY ("knowledge_base_id") REFERENCES "knowledge_bases" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION, CONSTRAINT "FK_7ef697ba4f123c7aa55aad478f2" FOREIGN KEY ("knowledge_group_id") REFERENCES "knowledge_groups" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION);
+1 -1
View File
@@ -42,7 +42,7 @@
"@types/cron": "^2.0.1",
"axios": "^1.13.2",
"bcrypt": "^6.0.0",
"better-sqlite3": "^12.5.0",
"better-sqlite3": "^12.10.0",
"class-transformer": "^0.5.1",
"class-validator": "^0.14.3",
"dotenv": "^17.2.3",
File diff suppressed because one or more lines are too long
-80
View File
@@ -1,80 +0,0 @@
const fs = require('fs');
const path = require('path');
const translationsPath = path.join('d:', 'workspace', 'AuraK', 'web', 'utils', 'translations.ts');
const usedKeysPath = path.join('d:', 'workspace', 'AuraK', 'all_used_keys.txt');
const usedKeys = fs.readFileSync(usedKeysPath, 'utf8').split('\n').filter(Boolean);
const translationsContent = fs.readFileSync(translationsPath, 'utf8');
const lines = translationsContent.split('\n');
let currentLang = null;
let resultLines = [];
let keysSeen = new Set();
const langStartRegex = /^\s+(\w+): \{/;
const keyRegex = /^(\s+)([a-zA-Z0-9_-]+):(.*)/;
function isValidIdentifier(id) {
return /^[a-zA-Z_$][a-zA-Z0-9_$]*$/.test(id);
}
for (let i = 0; i < lines.length; i++) {
const line = lines[i];
const langMatch = line.match(langStartRegex);
if (langMatch) {
if (currentLang) {
addMissingUsedKeys(currentLang, resultLines, keysSeen);
}
currentLang = langMatch[1];
keysSeen = new Set();
resultLines.push(line);
continue;
}
if (currentLang) {
const keyMatch = line.match(keyRegex);
if (keyMatch) {
const indent = keyMatch[1];
let key = keyMatch[2];
const rest = keyMatch[3];
// Note: keyMatch[2] might already be quoted if it was fixed in a previous run
const actualKey = (key.startsWith('"') && key.endsWith('"')) || (key.startsWith("'") && key.endsWith("'"))
? key.slice(1, -1)
: key;
keysSeen.add(actualKey);
if (!isValidIdentifier(actualKey)) {
resultLines.push(`${indent}"${actualKey}":${rest}`);
continue;
}
}
if (line.trim() === '},' || (line.trim() === '}' && i > 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!');
-42
View File
@@ -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=== 测试完成 ===');
-41
View File
@@ -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.
+2 -2
View File
@@ -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));
-32
View File
@@ -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
-1
View File
@@ -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);
-2090
View File
@@ -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)
-4
View File
@@ -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`);"
}
-265
View File
@@ -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 接口定义