Add metadata context (#946)

* Do not throw errors and allow partial features
* Add created and modified time to chunk
This commit is contained in:
Logan Yang 2024-12-19 12:01:49 -08:00 committed by GitHub
parent ec91c59729
commit eb47b7bcd9
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
4 changed files with 22 additions and 12 deletions

View file

@ -294,7 +294,6 @@ export default class CopilotPlugin extends Plugin {
name: "Force re-index vault for QA",
callback: async () => {
try {
await this.vectorStoreManager.clearIndex();
const indexedFileCount = await this.vectorStoreManager.indexVaultToVectorStore(true);
new Notice(`${indexedFileCount} vault files re-indexed to Copilot index.`);

View file

@ -104,10 +104,8 @@ export class DBOperations {
return newDb;
} catch (error) {
console.error(`Error initializing Orama database:`, error);
if (error instanceof CustomError) {
throw error;
}
throw new CustomError(`Failed to initialize database: ${error.message}`);
new Notice("Failed to initialize Copilot database. Some features may be limited.");
return undefined;
}
}
@ -181,6 +179,9 @@ export class DBOperations {
}
public getDb(): Orama<any> | undefined {
if (!this.oramaDb) {
console.warn("Database not initialized. Some features may be limited.");
}
return this.oramaDb;
}

View file

@ -3,6 +3,7 @@ import { CustomError } from "@/error";
import EmbeddingsManager from "@/LLMProviders/embeddingManager";
import { RateLimiter } from "@/rateLimiter";
import { getSettings, subscribeToSettingsChange } from "@/settings/model";
import { formatDateTime } from "@/utils";
import { Embeddings } from "@langchain/core/embeddings";
import { MD5 } from "crypto-js";
import { RecursiveCharacterTextSplitter } from "langchain/text_splitter";
@ -62,7 +63,11 @@ export class IndexOperations {
mtime: file.stat.mtime,
tags: fileCache?.tags?.map((tag) => tag.tag) ?? [],
extension: file.extension,
metadata: fileCache?.frontmatter ?? {},
metadata: {
...(fileCache?.frontmatter ?? {}),
created: formatDateTime(new Date(file.stat.ctime)).display,
modified: formatDateTime(new Date(file.stat.mtime)).display,
},
};
await this.indexDocument(embeddingInstance, fileToSave);
@ -79,7 +84,9 @@ export class IndexOperations {
// Add note title as contextual chunk headers
// https://js.langchain.com/docs/modules/data_connection/document_transformers/contextual_chunk_headers
const chunks = await textSplitter.createDocuments([fileToSave.content], [], {
chunkHeader: `\n\nNOTE TITLE: [[${fileToSave.title}]]\n\nNOTE BLOCK CONTENT:\n\n`,
chunkHeader: `\n\nNOTE TITLE: [[${fileToSave.title}]]\n\nMETADATA:${JSON.stringify(
fileToSave.metadata
)}\n\nNOTE BLOCK CONTENT:\n\n`,
appendChunkOverlapHeader: true,
});
@ -401,7 +408,11 @@ export class IndexOperations {
mtime: file.stat.mtime,
tags: fileCache?.tags?.map((tag) => tag.tag) ?? [],
extension: file.extension,
metadata: fileCache?.frontmatter ?? {},
metadata: {
...(fileCache?.frontmatter ?? {}),
created: file.stat.ctime,
modified: file.stat.mtime,
},
};
await this.indexDocument(embeddingInstance, fileToSave);

View file

@ -57,7 +57,6 @@ export default class VectorStoreManager {
private async initialize(): Promise<void> {
try {
// Add retry logic for initialization
let retries = 3;
while (retries > 0) {
try {
@ -70,17 +69,17 @@ export default class VectorStoreManager {
) {
retries--;
if (retries > 0) {
await new Promise((resolve) => setTimeout(resolve, 100)); // Wait 0.1 second before retry
await new Promise((resolve) => setTimeout(resolve, 100));
continue;
}
}
throw error;
console.error("Failed to initialize vector store:", error);
break;
}
}
this.eventHandler.initializeEventListeners();
} catch (error) {
console.error("Failed to initialize vector store:", error);
throw error;
}
}