knowledge-base.entity.ts 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. import {
  2. Column,
  3. CreateDateColumn,
  4. Entity,
  5. PrimaryGeneratedColumn,
  6. UpdateDateColumn,
  7. ManyToMany,
  8. ManyToOne,
  9. JoinColumn,
  10. } from 'typeorm';
  11. import { KnowledgeGroup } from '../knowledge-group/knowledge-group.entity';
  12. import { Tenant } from '../tenant/tenant.entity';
  13. export enum FileStatus {
  14. PENDING = 'pending',
  15. INDEXING = 'indexing',
  16. EXTRACTED = 'extracted', // Text extraction completed and saved to database
  17. VECTORIZED = 'vectorized', // Vectorization completed and indexed to ES
  18. FAILED = 'failed',
  19. }
  20. export enum ProcessingMode {
  21. FAST = 'fast', // Fast mode - use Tika
  22. PRECISE = 'precise', // Precise mode - use Vision Pipeline
  23. }
  24. @Entity('knowledge_bases')
  25. export class KnowledgeBase {
  26. @PrimaryGeneratedColumn('uuid')
  27. id: string;
  28. @Column({ name: 'original_name' })
  29. originalName: string;
  30. @Column({ nullable: true })
  31. title: string;
  32. @Column({ name: 'storage_path' })
  33. storagePath: string;
  34. @Column({ type: 'integer', default: 0 })
  35. size: number;
  36. @Column({ length: 100, nullable: true })
  37. mimetype: string;
  38. @Column({
  39. type: 'simple-enum',
  40. enum: FileStatus,
  41. default: FileStatus.PENDING,
  42. })
  43. status: FileStatus;
  44. @Column({ name: 'user_id', nullable: true }) // Temporarily allowed empty (for debugging), should be required in future
  45. userId: string;
  46. @Column({ name: 'tenant_id', nullable: true, type: 'text' })
  47. tenantId: string;
  48. @ManyToOne(() => Tenant, { nullable: true, onDelete: 'CASCADE' })
  49. @JoinColumn({ name: 'tenant_id' })
  50. tenant: Tenant;
  51. @Column({ type: 'text', nullable: true })
  52. content: string; // Stores text content extracted by Tika
  53. // Index setting parameters
  54. @Column({ name: 'chunk_size', type: 'integer', default: 1000 })
  55. chunkSize: number;
  56. @Column({ name: 'chunk_overlap', type: 'integer', default: 200 })
  57. chunkOverlap: number;
  58. @Column({ name: 'embedding_model_id', nullable: true })
  59. embeddingModelId: string;
  60. @Column({
  61. type: 'simple-enum',
  62. enum: ProcessingMode,
  63. default: ProcessingMode.FAST,
  64. name: 'processing_mode',
  65. })
  66. processingMode: ProcessingMode;
  67. @Column({ type: 'json', nullable: true })
  68. metadata: any; // Stores additional metadata (image descriptions, confidence, etc.)
  69. @Column({ name: 'pdf_path', nullable: true })
  70. pdfPath: string; // PDF file path (for preview)
  71. @ManyToMany(() => KnowledgeGroup, (group) => group.knowledgeBases)
  72. groups: KnowledgeGroup[];
  73. @CreateDateColumn({ name: 'created_at' })
  74. createdAt: Date;
  75. @UpdateDateColumn({ name: 'updated_at' })
  76. updatedAt: Date;
  77. }