'use client' import type { DocType } from '@/models/datasets' import type { I18nKeysByPrefix } from '@/types/i18n' import { useTranslation } from 'react-i18next' import useTimestamp from '@/hooks/use-timestamp' import { ChunkingMode } from '@/models/datasets' import { formatFileSize, formatNumber, formatTime } from '@/utils/format' export type inputType = 'input' | 'select' | 'textarea' type MetadataType = DocType | 'originInfo' | 'technicalParameters' type MetadataMap = Record< MetadataType, { text: string allowEdit?: boolean icon?: React.ReactNode iconName?: string subFieldsMap: Record< string, { label: string inputType?: inputType field?: string render?: (value: any, total?: number) => React.ReactNode | string } > } > const fieldPrefix = 'metadata.field' export const useMetadataMap = (): MetadataMap => { const { t } = useTranslation() const { formatTime: formatTimestamp } = useTimestamp() return { book: { text: t($ => $['metadata.type.book'], { ns: 'datasetDocuments' }), iconName: 'bookOpen', subFieldsMap: { title: { label: t($ => $[`${fieldPrefix}.book.title`], { ns: 'datasetDocuments' }) }, language: { label: t($ => $[`${fieldPrefix}.book.language`], { ns: 'datasetDocuments' }), inputType: 'select', }, author: { label: t($ => $[`${fieldPrefix}.book.author`], { ns: 'datasetDocuments' }) }, publisher: { label: t($ => $[`${fieldPrefix}.book.publisher`], { ns: 'datasetDocuments' }) }, publication_date: { label: t($ => $[`${fieldPrefix}.book.publicationDate`], { ns: 'datasetDocuments' }) }, isbn: { label: t($ => $[`${fieldPrefix}.book.ISBN`], { ns: 'datasetDocuments' }) }, category: { label: t($ => $[`${fieldPrefix}.book.category`], { ns: 'datasetDocuments' }), inputType: 'select', }, }, }, web_page: { text: t($ => $['metadata.type.webPage'], { ns: 'datasetDocuments' }), iconName: 'globe', subFieldsMap: { 'title': { label: t($ => $[`${fieldPrefix}.webPage.title`], { ns: 'datasetDocuments' }) }, 'url': { label: t($ => $[`${fieldPrefix}.webPage.url`], { ns: 'datasetDocuments' }) }, 'language': { label: t($ => $[`${fieldPrefix}.webPage.language`], { ns: 'datasetDocuments' }), inputType: 'select', }, 'author/publisher': { label: t($ => $[`${fieldPrefix}.webPage.authorPublisher`], { ns: 'datasetDocuments' }) }, 'publish_date': { label: t($ => $[`${fieldPrefix}.webPage.publishDate`], { ns: 'datasetDocuments' }) }, 'topic/keywords': { label: t($ => $[`${fieldPrefix}.webPage.topicKeywords`], { ns: 'datasetDocuments' }) }, 'description': { label: t($ => $[`${fieldPrefix}.webPage.description`], { ns: 'datasetDocuments' }) }, }, }, paper: { text: t($ => $['metadata.type.paper'], { ns: 'datasetDocuments' }), iconName: 'graduationHat', subFieldsMap: { 'title': { label: t($ => $[`${fieldPrefix}.paper.title`], { ns: 'datasetDocuments' }) }, 'language': { label: t($ => $[`${fieldPrefix}.paper.language`], { ns: 'datasetDocuments' }), inputType: 'select', }, 'author': { label: t($ => $[`${fieldPrefix}.paper.author`], { ns: 'datasetDocuments' }) }, 'publish_date': { label: t($ => $[`${fieldPrefix}.paper.publishDate`], { ns: 'datasetDocuments' }) }, 'journal/conference_name': { label: t($ => $[`${fieldPrefix}.paper.journalConferenceName`], { ns: 'datasetDocuments' }), }, 'volume/issue/page_numbers': { label: t($ => $[`${fieldPrefix}.paper.volumeIssuePage`], { ns: 'datasetDocuments' }) }, 'doi': { label: t($ => $[`${fieldPrefix}.paper.DOI`], { ns: 'datasetDocuments' }) }, 'topic/keywords': { label: t($ => $[`${fieldPrefix}.paper.topicsKeywords`], { ns: 'datasetDocuments' }) }, 'abstract': { label: t($ => $[`${fieldPrefix}.paper.abstract`], { ns: 'datasetDocuments' }), inputType: 'textarea', }, }, }, social_media_post: { text: t($ => $['metadata.type.socialMediaPost'], { ns: 'datasetDocuments' }), iconName: 'atSign', subFieldsMap: { 'platform': { label: t($ => $[`${fieldPrefix}.socialMediaPost.platform`], { ns: 'datasetDocuments' }) }, 'author/username': { label: t($ => $[`${fieldPrefix}.socialMediaPost.authorUsername`], { ns: 'datasetDocuments' }), }, 'publish_date': { label: t($ => $[`${fieldPrefix}.socialMediaPost.publishDate`], { ns: 'datasetDocuments' }) }, 'post_url': { label: t($ => $[`${fieldPrefix}.socialMediaPost.postURL`], { ns: 'datasetDocuments' }) }, 'topics/tags': { label: t($ => $[`${fieldPrefix}.socialMediaPost.topicsTags`], { ns: 'datasetDocuments' }) }, }, }, personal_document: { text: t($ => $['metadata.type.personalDocument'], { ns: 'datasetDocuments' }), iconName: 'file', subFieldsMap: { 'title': { label: t($ => $[`${fieldPrefix}.personalDocument.title`], { ns: 'datasetDocuments' }) }, 'author': { label: t($ => $[`${fieldPrefix}.personalDocument.author`], { ns: 'datasetDocuments' }) }, 'creation_date': { label: t($ => $[`${fieldPrefix}.personalDocument.creationDate`], { ns: 'datasetDocuments' }), }, 'last_modified_date': { label: t($ => $[`${fieldPrefix}.personalDocument.lastModifiedDate`], { ns: 'datasetDocuments' }), }, 'document_type': { label: t($ => $[`${fieldPrefix}.personalDocument.documentType`], { ns: 'datasetDocuments' }), inputType: 'select', }, 'tags/category': { label: t($ => $[`${fieldPrefix}.personalDocument.tagsCategory`], { ns: 'datasetDocuments' }), }, }, }, business_document: { text: t($ => $['metadata.type.businessDocument'], { ns: 'datasetDocuments' }), iconName: 'briefcase', subFieldsMap: { 'title': { label: t($ => $[`${fieldPrefix}.businessDocument.title`], { ns: 'datasetDocuments' }) }, 'author': { label: t($ => $[`${fieldPrefix}.businessDocument.author`], { ns: 'datasetDocuments' }) }, 'creation_date': { label: t($ => $[`${fieldPrefix}.businessDocument.creationDate`], { ns: 'datasetDocuments' }), }, 'last_modified_date': { label: t($ => $[`${fieldPrefix}.businessDocument.lastModifiedDate`], { ns: 'datasetDocuments' }), }, 'document_type': { label: t($ => $[`${fieldPrefix}.businessDocument.documentType`], { ns: 'datasetDocuments' }), inputType: 'select', }, 'department/team': { label: t($ => $[`${fieldPrefix}.businessDocument.departmentTeam`], { ns: 'datasetDocuments' }), }, }, }, im_chat_log: { text: t($ => $['metadata.type.IMChat'], { ns: 'datasetDocuments' }), iconName: 'messageTextCircle', subFieldsMap: { 'chat_platform': { label: t($ => $[`${fieldPrefix}.IMChat.chatPlatform`], { ns: 'datasetDocuments' }) }, 'chat_participants/group_name': { label: t($ => $[`${fieldPrefix}.IMChat.chatPartiesGroupName`], { ns: 'datasetDocuments' }), }, 'start_date': { label: t($ => $[`${fieldPrefix}.IMChat.startDate`], { ns: 'datasetDocuments' }) }, 'end_date': { label: t($ => $[`${fieldPrefix}.IMChat.endDate`], { ns: 'datasetDocuments' }) }, 'participants': { label: t($ => $[`${fieldPrefix}.IMChat.participants`], { ns: 'datasetDocuments' }) }, 'topicKeywords': { label: t($ => $[`${fieldPrefix}.IMChat.topicsKeywords`], { ns: 'datasetDocuments' }), inputType: 'textarea', }, 'fileType': { label: t($ => $[`${fieldPrefix}.IMChat.fileType`], { ns: 'datasetDocuments' }) }, }, }, wikipedia_entry: { text: t($ => $['metadata.type.wikipediaEntry'], { ns: 'datasetDocuments' }), allowEdit: false, subFieldsMap: { 'title': { label: t($ => $[`${fieldPrefix}.wikipediaEntry.title`], { ns: 'datasetDocuments' }) }, 'language': { label: t($ => $[`${fieldPrefix}.wikipediaEntry.language`], { ns: 'datasetDocuments' }), inputType: 'select', }, 'web_page_url': { label: t($ => $[`${fieldPrefix}.wikipediaEntry.webpageURL`], { ns: 'datasetDocuments' }) }, 'editor/contributor': { label: t($ => $[`${fieldPrefix}.wikipediaEntry.editorContributor`], { ns: 'datasetDocuments' }), }, 'last_edit_date': { label: t($ => $[`${fieldPrefix}.wikipediaEntry.lastEditDate`], { ns: 'datasetDocuments' }), }, 'summary/introduction': { label: t($ => $[`${fieldPrefix}.wikipediaEntry.summaryIntroduction`], { ns: 'datasetDocuments' }), inputType: 'textarea', }, }, }, synced_from_notion: { text: t($ => $['metadata.type.notion'], { ns: 'datasetDocuments' }), allowEdit: false, subFieldsMap: { 'title': { label: t($ => $[`${fieldPrefix}.notion.title`], { ns: 'datasetDocuments' }) }, 'language': { label: t($ => $[`${fieldPrefix}.notion.language`], { ns: 'datasetDocuments' }), inputType: 'select' }, 'author/creator': { label: t($ => $[`${fieldPrefix}.notion.author`], { ns: 'datasetDocuments' }) }, 'creation_date': { label: t($ => $[`${fieldPrefix}.notion.createdTime`], { ns: 'datasetDocuments' }) }, 'last_modified_date': { label: t($ => $[`${fieldPrefix}.notion.lastModifiedTime`], { ns: 'datasetDocuments' }), }, 'notion_page_link': { label: t($ => $[`${fieldPrefix}.notion.url`], { ns: 'datasetDocuments' }) }, 'category/tags': { label: t($ => $[`${fieldPrefix}.notion.tag`], { ns: 'datasetDocuments' }) }, 'description': { label: t($ => $[`${fieldPrefix}.notion.description`], { ns: 'datasetDocuments' }) }, }, }, synced_from_github: { text: t($ => $['metadata.type.github'], { ns: 'datasetDocuments' }), allowEdit: false, subFieldsMap: { 'repository_name': { label: t($ => $[`${fieldPrefix}.github.repoName`], { ns: 'datasetDocuments' }) }, 'repository_description': { label: t($ => $[`${fieldPrefix}.github.repoDesc`], { ns: 'datasetDocuments' }) }, 'repository_owner/organization': { label: t($ => $[`${fieldPrefix}.github.repoOwner`], { ns: 'datasetDocuments' }) }, 'code_filename': { label: t($ => $[`${fieldPrefix}.github.fileName`], { ns: 'datasetDocuments' }) }, 'code_file_path': { label: t($ => $[`${fieldPrefix}.github.filePath`], { ns: 'datasetDocuments' }) }, 'programming_language': { label: t($ => $[`${fieldPrefix}.github.programmingLang`], { ns: 'datasetDocuments' }) }, 'github_link': { label: t($ => $[`${fieldPrefix}.github.url`], { ns: 'datasetDocuments' }) }, 'open_source_license': { label: t($ => $[`${fieldPrefix}.github.license`], { ns: 'datasetDocuments' }) }, 'commit_date': { label: t($ => $[`${fieldPrefix}.github.lastCommitTime`], { ns: 'datasetDocuments' }) }, 'commit_author': { label: t($ => $[`${fieldPrefix}.github.lastCommitAuthor`], { ns: 'datasetDocuments' }), }, }, }, originInfo: { text: '', allowEdit: false, subFieldsMap: { 'name': { label: t($ => $[`${fieldPrefix}.originInfo.originalFilename`], { ns: 'datasetDocuments' }) }, 'data_source_info.upload_file.size': { label: t($ => $[`${fieldPrefix}.originInfo.originalFileSize`], { ns: 'datasetDocuments' }), render: value => formatFileSize(value), }, 'created_at': { label: t($ => $[`${fieldPrefix}.originInfo.uploadDate`], { ns: 'datasetDocuments' }), render: value => formatTimestamp(value, t($ => $['metadata.dateTimeFormat'], { ns: 'datasetDocuments' }) as string), }, 'completed_at': { label: t($ => $[`${fieldPrefix}.originInfo.lastUpdateDate`], { ns: 'datasetDocuments' }), render: value => formatTimestamp(value, t($ => $['metadata.dateTimeFormat'], { ns: 'datasetDocuments' }) as string), }, 'data_source_type': { label: t($ => $[`${fieldPrefix}.originInfo.source`], { ns: 'datasetDocuments' }), render: (value: I18nKeysByPrefix<'datasetDocuments', 'metadata.source.'> | 'notion_import') => t($ => $[`metadata.source.${value === 'notion_import' ? 'notion' : value}`], { ns: 'datasetDocuments' }), }, }, }, technicalParameters: { text: t($ => $['metadata.type.technicalParameters'], { ns: 'datasetDocuments' }), allowEdit: false, subFieldsMap: { 'doc_form': { label: t($ => $[`${fieldPrefix}.technicalParameters.segmentSpecification`], { ns: 'datasetDocuments' }), render: (value) => { if (value === ChunkingMode.text) return t($ => $['chunkingMode.general'], { ns: 'dataset' }) if (value === ChunkingMode.qa) return t($ => $['chunkingMode.qa'], { ns: 'dataset' }) if (value === ChunkingMode.parentChild) return t($ => $['chunkingMode.parentChild'], { ns: 'dataset' }) return '--' }, }, 'dataset_process_rule.rules.segmentation.max_tokens': { label: t($ => $[`${fieldPrefix}.technicalParameters.segmentLength`], { ns: 'datasetDocuments' }), render: value => formatNumber(value), }, 'average_segment_length': { label: t($ => $[`${fieldPrefix}.technicalParameters.avgParagraphLength`], { ns: 'datasetDocuments' }), render: value => `${formatNumber(value)} characters`, }, 'segment_count': { label: t($ => $[`${fieldPrefix}.technicalParameters.paragraphs`], { ns: 'datasetDocuments' }), render: value => `${formatNumber(value)} paragraphs`, }, 'hit_count': { label: t($ => $[`${fieldPrefix}.technicalParameters.hitCount`], { ns: 'datasetDocuments' }), render: (value, total) => { const v = value || 0 return `${!total ? 0 : ((v / total) * 100).toFixed(2)}% (${v}/${total})` }, }, 'indexing_latency': { label: t($ => $[`${fieldPrefix}.technicalParameters.embeddingTime`], { ns: 'datasetDocuments' }), render: value => formatTime(value), }, 'tokens': { label: t($ => $[`${fieldPrefix}.technicalParameters.embeddedSpend`], { ns: 'datasetDocuments' }), render: value => `${formatNumber(value)} tokens`, }, }, }, } } const langPrefix = 'metadata.languageMap.' export const useLanguages = () => { const { t } = useTranslation() return { zh: t($ => $[`${langPrefix}zh`], { ns: 'datasetDocuments' }), en: t($ => $[`${langPrefix}en`], { ns: 'datasetDocuments' }), es: t($ => $[`${langPrefix}es`], { ns: 'datasetDocuments' }), fr: t($ => $[`${langPrefix}fr`], { ns: 'datasetDocuments' }), de: t($ => $[`${langPrefix}de`], { ns: 'datasetDocuments' }), ja: t($ => $[`${langPrefix}ja`], { ns: 'datasetDocuments' }), ko: t($ => $[`${langPrefix}ko`], { ns: 'datasetDocuments' }), ru: t($ => $[`${langPrefix}ru`], { ns: 'datasetDocuments' }), ar: t($ => $[`${langPrefix}ar`], { ns: 'datasetDocuments' }), pt: t($ => $[`${langPrefix}pt`], { ns: 'datasetDocuments' }), it: t($ => $[`${langPrefix}it`], { ns: 'datasetDocuments' }), nl: t($ => $[`${langPrefix}nl`], { ns: 'datasetDocuments' }), pl: t($ => $[`${langPrefix}pl`], { ns: 'datasetDocuments' }), sv: t($ => $[`${langPrefix}sv`], { ns: 'datasetDocuments' }), tr: t($ => $[`${langPrefix}tr`], { ns: 'datasetDocuments' }), he: t($ => $[`${langPrefix}he`], { ns: 'datasetDocuments' }), hi: t($ => $[`${langPrefix}hi`], { ns: 'datasetDocuments' }), da: t($ => $[`${langPrefix}da`], { ns: 'datasetDocuments' }), fi: t($ => $[`${langPrefix}fi`], { ns: 'datasetDocuments' }), no: t($ => $[`${langPrefix}no`], { ns: 'datasetDocuments' }), hu: t($ => $[`${langPrefix}hu`], { ns: 'datasetDocuments' }), el: t($ => $[`${langPrefix}el`], { ns: 'datasetDocuments' }), cs: t($ => $[`${langPrefix}cs`], { ns: 'datasetDocuments' }), th: t($ => $[`${langPrefix}th`], { ns: 'datasetDocuments' }), id: t($ => $[`${langPrefix}id`], { ns: 'datasetDocuments' }), ro: t($ => $[`${langPrefix}ro`], { ns: 'datasetDocuments' }), } }