1- /* eslint-disable @typescript-eslint/no-unsafe-return */
2- /* eslint-disable @typescript-eslint/no-unsafe-assignment */
3-
4- import { ChatOpenAI } from '@langchain/openai' ;
5-
61import VectorTermsService from '../../src/services/vector-terms-service' ;
72import InteractionHistory from '../../src/interaction-history' ;
8- import { mockAIResponse } from '../fixture' ;
9- import OpenAICompletionService from '../../src/services/openai-completion-service' ;
10- import Trajectory from '../../src/lib/trajectory' ;
11- import MessageTokenReducerService from '../../src/services/message-token-reducer-service' ;
12-
13- jest . mock ( '@langchain/openai' ) ;
14- const completionWithRetry = jest . mocked ( ChatOpenAI . prototype . completionWithRetry ) ;
3+ import MockCompletionService from './mock-completion-service' ;
154
165describe ( 'VectorTermsService' , ( ) => {
176 let interactionHistory : InteractionHistory ;
187 let service : VectorTermsService ;
19- let trajectory : Trajectory ;
8+ const completion = new MockCompletionService ( ) ;
9+ const complete = jest . spyOn ( completion , 'complete' ) ;
2010
2111 beforeEach ( ( ) => {
2212 interactionHistory = new InteractionHistory ( ) ;
2313 interactionHistory . on ( 'event' , ( event ) => console . log ( event . message ) ) ;
24- trajectory = new Trajectory ( ) ;
25- service = new VectorTermsService (
26- interactionHistory ,
27- new OpenAICompletionService ( 'gpt-4' , 0.5 , trajectory , new MessageTokenReducerService ( ) )
28- ) ;
14+ service = new VectorTermsService ( interactionHistory , completion ) ;
2915 } ) ;
30- afterEach ( ( ) => jest . resetAllMocks ( ) ) ;
16+ afterEach ( ( ) => jest . restoreAllMocks ( ) ) ;
3117
3218 describe ( 'when LLM suggested terms' , ( ) => {
3319 describe ( 'is a valid JSON object' , ( ) => {
3420 it ( 'is recorded in the interaction history' , async ( ) => {
35- mockAIResponse ( completionWithRetry , [ `{"terms": ["user", "management"]}` ] ) ;
21+ completion . mock ( `{"terms": ["user", "management"]}` ) ;
3622 await service . suggestTerms ( 'user management' ) ;
3723 expect ( interactionHistory . events . map ( ( e ) => ( { ...e } ) ) ) . toEqual ( [
3824 {
@@ -42,73 +28,73 @@ describe('VectorTermsService', () => {
4228 ] ) ;
4329 } ) ;
4430 it ( 'should return the terms' , async ( ) => {
45- mockAIResponse ( completionWithRetry , [ `{"terms": ["user", "management"]}` ] ) ;
31+ completion . mock ( `{"terms": ["user", "management"]}` ) ;
4632 const terms = await service . suggestTerms ( 'user management' ) ;
4733 expect ( terms ) . toEqual ( [ 'user' , 'management' ] ) ;
48- expect ( completionWithRetry ) . toHaveBeenCalledTimes ( 1 ) ;
34+ expect ( complete ) . toHaveBeenCalledTimes ( 1 ) ;
4935 } ) ;
5036 it ( 'removes very short terms' , async ( ) => {
51- mockAIResponse ( completionWithRetry , [ `["user", "management", "a"]` ] ) ;
37+ completion . mock ( `["user", "management", "a"]` ) ;
5238 const terms = await service . suggestTerms ( 'user management' ) ;
5339 expect ( terms ) . toEqual ( [ 'user' , 'management' , 'a' ] ) ;
54- expect ( completionWithRetry ) . toHaveBeenCalledTimes ( 1 ) ;
40+ expect ( complete ) . toHaveBeenCalledTimes ( 1 ) ;
5541 } ) ;
5642 it ( 'converts underscore_words to distinct words' , async ( ) => {
57- mockAIResponse ( completionWithRetry , [ `["user_management"]` ] ) ;
43+ completion . mock ( `["user_management"]` ) ;
5844 const terms = await service . suggestTerms ( 'user management' ) ;
5945 expect ( terms ) . toEqual ( [ 'user_management' ] ) ;
60- expect ( completionWithRetry ) . toHaveBeenCalledTimes ( 1 ) ;
46+ expect ( complete ) . toHaveBeenCalledTimes ( 1 ) ;
6147 } ) ;
6248 } ) ;
6349
6450 describe ( 'are a valid JSON list' , ( ) => {
6551 it ( 'should return the terms' , async ( ) => {
66- mockAIResponse ( completionWithRetry , [ '["user", "management"]' ] ) ;
52+ completion . mock ( '["user", "management"]' ) ;
6753 const terms = await service . suggestTerms ( 'user management' ) ;
6854 expect ( terms ) . toEqual ( [ 'user' , 'management' ] ) ;
6955 } ) ;
7056 } ) ;
7157
7258 describe ( 'are valid JSON wrapped in fences' , ( ) => {
7359 it ( 'should return the terms' , async ( ) => {
74- mockAIResponse ( completionWithRetry , [ '```json\n' , ' ["user", "management"]\n' , ' ```\n'] ) ;
60+ completion . mock ( '```json\n["user", "management"]\n```\n' ) ;
7561 const terms = await service . suggestTerms ( 'user management' ) ;
7662 expect ( terms ) . toEqual ( [ 'user' , 'management' ] ) ;
7763 } ) ;
7864 } ) ;
7965
8066 describe ( 'is YAML' , ( ) => {
8167 it ( 'parses the terms' , async ( ) => {
82- mockAIResponse ( completionWithRetry , [ 'response_key:\n' , ' - user\n' , ' - management\n' ] ) ;
68+ completion . mock ( 'response_key:\n' , ' - user\n' , ' - management\n' ) ;
8369 const terms = await service . suggestTerms ( 'user management' ) ;
8470 expect ( terms ) . toEqual ( [ 'response_key:' , '-' , 'user' , 'management' ] ) ;
8571 } ) ;
8672 } ) ;
8773
8874 describe ( 'is prefixed by "Terms:"' , ( ) => {
8975 it ( 'is accepted and processed' , async ( ) => {
90- mockAIResponse ( completionWithRetry , [ 'Terms: ["user", "management"]' ] ) ;
76+ completion . mock ( 'Terms: ["user", "management"]' ) ;
9177 const terms = await service . suggestTerms ( 'user management' ) ;
9278 expect ( terms ) . toEqual ( [ 'user' , 'management' ] ) ;
93- expect ( completionWithRetry ) . toHaveBeenCalledTimes ( 1 ) ;
79+ expect ( complete ) . toHaveBeenCalledTimes ( 1 ) ;
9480 } ) ;
9581 } ) ;
9682
9783 describe ( 'includes terms with "+" prefix' , ( ) => {
9884 it ( 'is accepted and processed' , async ( ) => {
99- mockAIResponse ( completionWithRetry , [ 'Terms: +user management' ] ) ;
85+ completion . mock ( 'Terms: +user management' ) ;
10086 const terms = await service . suggestTerms ( 'user management' ) ;
10187 expect ( terms ) . toEqual ( [ '+user' , 'management' ] ) ;
102- expect ( completionWithRetry ) . toHaveBeenCalledTimes ( 1 ) ;
88+ expect ( complete ) . toHaveBeenCalledTimes ( 1 ) ;
10389 } ) ;
10490 } ) ;
10591
106- describe ( 'is list-ish ' , ( ) => {
92+ describe ( 'is list-ish' , ( ) => {
10793 it ( 'is accepted and processed' , async ( ) => {
108- mockAIResponse ( completionWithRetry , [ '-user -mgmt' ] ) ;
94+ completion . mock ( '-user -mgmt' ) ;
10995 const terms = await service . suggestTerms ( 'user management' ) ;
11096 expect ( terms ) . toEqual ( [ '-user' , '-mgmt' ] ) ;
111- expect ( completionWithRetry ) . toHaveBeenCalledTimes ( 1 ) ;
97+ expect ( complete ) . toHaveBeenCalledTimes ( 1 ) ;
11298 } ) ;
11399 } ) ;
114100 } ) ;
0 commit comments