chore: snapshot before performance optimization
This commit is contained in:
@@ -454,7 +454,7 @@ Deine Antwort (nur JSON):
|
||||
let names: string[] = []
|
||||
if (note.labels) {
|
||||
try {
|
||||
const parsed = JSON.parse(note.labels) as unknown
|
||||
const parsed = note.labels as unknown
|
||||
names = Array.isArray(parsed)
|
||||
? parsed.filter((n): n is string => typeof n === 'string' && n.trim().length > 0)
|
||||
: []
|
||||
@@ -471,7 +471,7 @@ Deine Antwort (nur JSON):
|
||||
await prisma.note.update({
|
||||
where: { id: noteId },
|
||||
data: {
|
||||
labels: JSON.stringify(names),
|
||||
labels: names as any,
|
||||
labelRelations: {
|
||||
connect: { id: label.id },
|
||||
},
|
||||
|
||||
@@ -175,26 +175,17 @@ export class EmbeddingService {
|
||||
}
|
||||
|
||||
/**
|
||||
* Serialize embedding to JSON-safe format (for storage)
|
||||
* Pass-through — embeddings are stored as native JSONB in PostgreSQL
|
||||
*/
|
||||
serialize(embedding: number[]): string {
|
||||
return JSON.stringify(embedding)
|
||||
serialize(embedding: number[]): number[] {
|
||||
return embedding
|
||||
}
|
||||
|
||||
/**
|
||||
* Deserialize embedding from JSON string
|
||||
* Pass-through — embeddings come back already parsed from PostgreSQL
|
||||
*/
|
||||
deserialize(jsonString: string): number[] {
|
||||
try {
|
||||
const parsed = JSON.parse(jsonString)
|
||||
if (!Array.isArray(parsed)) {
|
||||
throw new Error('Invalid embedding format')
|
||||
}
|
||||
return parsed
|
||||
} catch (error) {
|
||||
console.error('Error deserializing embedding:', error)
|
||||
throw new Error('Failed to deserialize embedding')
|
||||
}
|
||||
deserialize(embedding: number[]): number[] {
|
||||
return embedding
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -77,11 +77,11 @@ export class MemoryEchoService {
|
||||
return [] // Need at least 2 notes to find connections
|
||||
}
|
||||
|
||||
// Parse embeddings
|
||||
// Parse embeddings (already native Json from PostgreSQL)
|
||||
const notesWithEmbeddings = notes
|
||||
.map(note => ({
|
||||
...note,
|
||||
embedding: note.embedding ? JSON.parse(note.embedding) : null
|
||||
embedding: note.embedding ? JSON.parse(note.embedding) as number[] : null
|
||||
}))
|
||||
.filter(note => note.embedding && Array.isArray(note.embedding))
|
||||
|
||||
@@ -108,7 +108,7 @@ export class MemoryEchoService {
|
||||
}
|
||||
|
||||
// Calculate cosine similarity
|
||||
const similarity = cosineSimilarity(note1.embedding, note2.embedding)
|
||||
const similarity = cosineSimilarity(note1.embedding!, note2.embedding!)
|
||||
|
||||
// Similarity threshold for meaningful connections
|
||||
if (similarity >= similarityThreshold) {
|
||||
@@ -348,9 +348,9 @@ Explain in one brief sentence (max 15 words) why these notes are connected. Focu
|
||||
feedbackType: feedback,
|
||||
feature: 'memory_echo',
|
||||
originalContent: JSON.stringify({ insightId }),
|
||||
metadata: JSON.stringify({
|
||||
metadata: {
|
||||
timestamp: new Date().toISOString()
|
||||
})
|
||||
} as any
|
||||
}
|
||||
})
|
||||
}
|
||||
@@ -426,8 +426,9 @@ Explain in one brief sentence (max 15 words) why these notes are connected. Focu
|
||||
return []
|
||||
}
|
||||
|
||||
// Parse target note embedding
|
||||
const targetEmbedding = JSON.parse(targetNote.embedding)
|
||||
// Target note embedding (already native Json from PostgreSQL)
|
||||
const targetEmbedding = targetNote.embedding ? JSON.parse(targetNote.embedding) as number[] : null
|
||||
if (!targetEmbedding) return []
|
||||
|
||||
// Check if user has demo mode enabled
|
||||
const settings = await prisma.userAISettings.findUnique({
|
||||
@@ -444,7 +445,8 @@ Explain in one brief sentence (max 15 words) why these notes are connected. Focu
|
||||
for (const otherNote of otherNotes) {
|
||||
if (!otherNote.embedding) continue
|
||||
|
||||
const otherEmbedding = JSON.parse(otherNote.embedding)
|
||||
const otherEmbedding = otherNote.embedding ? JSON.parse(otherNote.embedding) as number[] : null
|
||||
if (!otherEmbedding) continue
|
||||
|
||||
// Check if this connection was dismissed
|
||||
const pairKey1 = `${targetNote.id}-${otherNote.id}`
|
||||
|
||||
@@ -192,7 +192,7 @@ export class SemanticSearchService {
|
||||
|
||||
// Calculate similarities for all notes
|
||||
const similarities = notes.map(note => {
|
||||
const noteEmbedding = embeddingService.deserialize(note.embedding || '[]')
|
||||
const noteEmbedding = note.embedding ? JSON.parse(note.embedding) as number[] : []
|
||||
const similarity = embeddingService.calculateCosineSimilarity(
|
||||
queryEmbedding,
|
||||
noteEmbedding
|
||||
@@ -283,7 +283,7 @@ export class SemanticSearchService {
|
||||
// Check if embedding needs regeneration
|
||||
const shouldRegenerate = embeddingService.shouldRegenerateEmbedding(
|
||||
note.content,
|
||||
note.embedding,
|
||||
note.embedding as any,
|
||||
note.lastAiAnalysis
|
||||
)
|
||||
|
||||
@@ -298,7 +298,7 @@ export class SemanticSearchService {
|
||||
await prisma.note.update({
|
||||
where: { id: noteId },
|
||||
data: {
|
||||
embedding: embeddingService.serialize(embedding),
|
||||
embedding: embeddingService.serialize(embedding) as any,
|
||||
lastAiAnalysis: new Date()
|
||||
}
|
||||
})
|
||||
|
||||
Reference in New Issue
Block a user