import { Column, CreateDateColumn, Entity, PrimaryGeneratedColumn, UpdateDateColumn, ManyToMany, } from 'typeorm'; import { KnowledgeGroup } from '../knowledge-group/knowledge-group.entity'; export enum FileStatus { PENDING = 'pending', INDEXING = 'indexing', EXTRACTED = 'extracted', // テキスト抽出が完了し、データベースに保存されました VECTORIZED = 'vectorized', // ベクトル化が完了し、ES にインデックスされました FAILED = 'failed', } export enum ProcessingMode { FAST = 'fast', // 高速モード - Tika を使用 PRECISE = 'precise', // 精密モード - Vision Pipeline を使用 } @Entity('knowledge_bases') export class KnowledgeBase { @PrimaryGeneratedColumn('uuid') id: string; @Column({ name: 'original_name' }) originalName: string; @Column({ name: 'storage_path' }) storagePath: string; @Column({ type: 'integer', default: 0 }) size: number; @Column({ length: 100, nullable: true }) mimetype: string; @Column({ type: 'simple-enum', enum: FileStatus, default: FileStatus.PENDING, }) status: FileStatus; @Column({ name: 'user_id', nullable: true }) // 暫定的に空を許可(デバッグ用)、将来的には必須にすべき userId: string; @Column({ type: 'text', nullable: true }) content: string; // Tika で抽出されたテキスト内容を保存 // インデックス設定パラメータ @Column({ name: 'chunk_size', type: 'integer', default: 1000 }) chunkSize: number; @Column({ name: 'chunk_overlap', type: 'integer', default: 200 }) chunkOverlap: number; @Column({ name: 'embedding_model_id', nullable: true }) embeddingModelId: string; @Column({ type: 'simple-enum', enum: ProcessingMode, default: ProcessingMode.FAST, name: 'processing_mode', }) processingMode: ProcessingMode; @Column({ type: 'json', nullable: true }) metadata: any; // 追加のメタデータを保存(画像の説明、信頼度など) @Column({ name: 'pdf_path', nullable: true }) pdfPath: string; // PDF ファイルパス(プレビュー用) @ManyToMany(() => KnowledgeGroup, (group) => group.knowledgeBases) groups: KnowledgeGroup[]; @CreateDateColumn({ name: 'created_at' }) createdAt: Date; @UpdateDateColumn({ name: 'updated_at' }) updatedAt: Date; }