seraph-agent
Version:
An extremely lightweight, SRE autonomous AI agent for seamless integration with common observability tasks.
118 lines (117 loc) • 5.13 kB
JavaScript
;
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || (function () {
var ownKeys = function(o) {
ownKeys = Object.getOwnPropertyNames || function (o) {
var ar = [];
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
return ar;
};
return ownKeys(o);
};
return function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
__setModuleDefault(result, mod);
return result;
};
})();
Object.defineProperty(exports, "__esModule", { value: true });
const knowledge_manager_1 = require("../knowledge-manager");
const cron = __importStar(require("node-cron"));
const faiss_1 = require("@langchain/community/vectorstores/faiss");
const knowledge = __importStar(require("../knowledge"));
const fs = __importStar(require("fs/promises"));
const embedding_provider_1 = require("../llm/embedding-provider");
jest.mock('node-cron');
jest.mock('@langchain/community/vectorstores/faiss');
jest.mock('../knowledge');
jest.mock('fs/promises');
jest.mock('../llm/embedding-provider');
const mockedCron = cron;
const mockedFaissStore = faiss_1.FaissStore;
const mockedKnowledge = knowledge;
const mockedFs = fs;
const mockedCreateEmbeddingProvider = embedding_provider_1.createEmbeddingProvider;
describe('KnowledgeManager', () => {
let config;
beforeEach(() => {
config = {
port: 8080,
workers: 1,
apiKey: 'test-key',
serverApiKey: null,
knowledge: {
enabled: true,
schedule: '0 0 * * *',
vectorStore: './db/seraph.faiss',
embeddings: { provider: 'huggingface' },
sources: [],
},
};
jest.clearAllMocks();
});
it('should not do anything if knowledge base is disabled', async () => {
config.knowledge.enabled = false;
const manager = new knowledge_manager_1.KnowledgeManager(config);
await manager.start();
expect(mockedCron.schedule).not.toHaveBeenCalled();
expect(mockedFaissStore.load).not.toHaveBeenCalled();
});
it('should schedule a build on start', async () => {
mockedFs.access.mockResolvedValue();
const manager = new knowledge_manager_1.KnowledgeManager(config);
await manager.start();
expect(mockedCron.schedule).toHaveBeenCalledWith('0 0 * * *', expect.any(Function));
});
it('should load existing vector store on start', async () => {
mockedFs.access.mockResolvedValue();
const manager = new knowledge_manager_1.KnowledgeManager(config);
await manager.start();
expect(mockedFaissStore.load).toHaveBeenCalledWith('./db/seraph.faiss', undefined);
});
it('should build a new vector store if one does not exist', async () => {
mockedFs.access.mockRejectedValue(new Error('ENOENT'));
const manager = new knowledge_manager_1.KnowledgeManager(config);
await manager.start();
expect(mockedKnowledge.buildKnowledgeBase).toHaveBeenCalledWith(config, undefined);
});
it('should call buildKnowledgeBase when build is called', async () => {
const manager = new knowledge_manager_1.KnowledgeManager(config);
await manager.build('test-source');
expect(mockedKnowledge.buildKnowledgeBase).toHaveBeenCalledWith(config, 'test-source');
});
it('should perform a similarity search', async () => {
const similaritySearchMock = jest.fn().mockResolvedValue([]);
mockedFaissStore.load.mockResolvedValue({
similaritySearch: similaritySearchMock,
});
mockedFs.access.mockResolvedValue();
const manager = new knowledge_manager_1.KnowledgeManager(config);
await manager.start();
await manager.search('test query', 5);
expect(similaritySearchMock).toHaveBeenCalledWith('test query', 5);
});
it('should return null from search if vector store is not loaded', async () => {
config.knowledge.enabled = false;
const manager = new knowledge_manager_1.KnowledgeManager(config);
const result = await manager.search('test query');
expect(result).toBeNull();
});
});