@wearesage/schema
Version:
A flexible schema definition and validation system for TypeScript with multi-database support
100 lines (83 loc) • 2.58 kB
text/typescript
import { Entity, Property, Id, ManyToOne, Index, Timestamp, Auth , Labels } from '../../core/decorators';
import { RelationshipType } from '../../adapters/neo4j';
import { PostgresMetadata } from '../../adapters/metadata-layer';
import { Embeddings } from '../../adapters/embeddings';
import { TestConversation } from './TestConversation';
()
(['Message'])
({ permissions: ['user'] })
({
fields: ['id', 'role', 'messageIndex', 'model', 'tokenCount', 'responseTime', 'createdAt'],
tableName: 'message_metadata'
})
({
fields: ['content', 'thinking'],
model: 'nomic-embed-text:latest',
provider: 'ollama',
dimensions: 768,
chunkSize: 512,
overlap: 50,
embeddingField: 'contentEmbedding',
metadataFields: ['id', 'role', 'messageIndex', 'model', 'createdAt']
})
export class TestMessage {
()
id!: string;
// The conversation this message belongs to
({
target: () => TestConversation,
inverse: 'messages',
neo4j: { type: 'BELONGS_TO', direction: 'OUT' }
})
('BELONGS_TO')
conversation!: TestConversation;
// Message content
({ required: true })
content!: string;
({ required: true })
()
role!: 'user' | 'assistant' | 'system';
// Sender information (who sent this message)
()
sender?: {
type: 'human' | 'ai';
id: string; // userId or model name
displayName?: string; // For display purposes
};
// AI-specific properties
()
thinking?: string; // AI's thinking process (for assistant messages)
()
model?: string; // Model used for this specific message
()
temperature?: number; // Temperature used for this message
()
responseTime?: number; // Time taken to generate response (in milliseconds)
()
tokenCount?: number; // Number of tokens in this message
// Message ordering
({ required: true })
()
messageIndex!: number; // Order of message in conversation (0, 1, 2, ...)
// Message metadata
()
isEdited?: boolean; // Whether this message was edited after creation
()
editHistory?: Array<{
content: string;
editedAt: Date;
reason?: string;
}>;
({ onCreate: true })
createdAt!: Date;
({ onUpdate: true })
updatedAt!: Date;
// Semantic embedding for content similarity search
()
contentEmbedding?: number[];
// Constructor
constructor() {
this.messageIndex = 0;
this.isEdited = false;
}
}