All files / kernel-test-local/src lms-chat.ts

100% Statements 17/17
100% Branches 0/0
100% Functions 3/3
100% Lines 17/17

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74                                              1x 1x   1x     1x       1x 1x           1x       1x         1x 1x   1x                   1x   1x 31x   1x 1x     1x    
import { NodejsPlatformServices } from '@metamask/kernel-node-runtime';
import { makeSQLKernelDatabase } from '@metamask/kernel-store/sqlite/nodejs';
import { waitUntilQuiescent } from '@metamask/kernel-utils';
import {
  Logger,
  makeArrayTransport,
  makeConsoleTransport,
} from '@metamask/logger';
import type { LogEntry } from '@metamask/logger';
import { Kernel } from '@metamask/ocap-kernel';
import type {
  ChatParams,
  ChatResult,
} from '@ocap/kernel-language-model-service';
import {
  LANGUAGE_MODEL_SERVICE_NAME,
  makeKernelLanguageModelService,
} from '@ocap/kernel-language-model-service';
import { expect } from 'vitest';
 
import { LMS_CHAT_MODEL } from './constants.ts';
import { filterTransports } from './utils.ts';
 
const getBundleSpec = (name: string): string =>
  new URL(`./vats/${name}.bundle`, import.meta.url).toString();
 
export const runLmsChatKernelTest = async (
  chat: (params: ChatParams & { stream?: true & false }) => Promise<ChatResult>,
): Promise<void> => {
  const kernelDatabase = await makeSQLKernelDatabase({
    dbFilename: ':memory:',
  });
 
  const entries: LogEntry[] = [];
  const logger = new Logger({
    transports: [
      filterTransports(makeConsoleTransport(), makeArrayTransport(entries)),
    ],
  });
 
  const platformServices = new NodejsPlatformServices({
    logger: logger.subLogger({ tags: ['vat-worker-manager'] }),
  });
 
  const kernel = await Kernel.make(platformServices, kernelDatabase, {
    resetStorage: true,
    logger,
  });
 
  const { name, service } = makeKernelLanguageModelService(chat);
  kernel.registerKernelServiceObject(name, service);
 
  await kernel.launchSubcluster({
    bootstrap: 'main',
    services: [LANGUAGE_MODEL_SERVICE_NAME],
    vats: {
      main: {
        bundleSpec: getBundleSpec('lms-chat-vat'),
        parameters: { model: LMS_CHAT_MODEL },
      },
    },
  });
  await waitUntilQuiescent(100);
 
  const responseEntry = entries.find((entry) =>
    entry.message?.startsWith('lms-chat response:'),
  );
  expect(responseEntry).toBeDefined();
  expect(responseEntry?.message?.length).toBeGreaterThan(
    'lms-chat response: '.length,
  );
  expect(responseEntry?.message).toMatch(/^lms-chat response: [hH]ello[.!]?$/u);
};