Skip to content
This repository was archived by the owner on Jul 4, 2025. It is now read-only.

Commit e020982

Browse files
authored
chore: correct engine reload on config save (#797)
1 parent e7bc983 commit e020982

File tree

6 files changed

+61
-19
lines changed

6 files changed

+61
-19
lines changed

cortex-js/src/extensions/extensions.module.ts

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -4,23 +4,27 @@ import MistralEngineExtension from './mistral.engine';
44
import OpenAIEngineExtension from './openai.engine';
55
import { HttpModule, HttpService } from '@nestjs/axios';
66
import { ConfigsUsecases } from '@/usecases/configs/configs.usecase';
7-
import { FileManagerModule } from '@/infrastructure/services/file-manager/file-manager.module';
7+
import { ConfigsModule } from '@/usecases/configs/configs.module';
8+
import { EventEmitter2, EventEmitterModule } from '@nestjs/event-emitter';
89

910
const provider = {
1011
provide: 'EXTENSIONS_PROVIDER',
11-
inject: [HttpService, ConfigsUsecases],
12-
useFactory: (httpService: HttpService, configUsecases: ConfigsUsecases) => [
13-
new OpenAIEngineExtension(httpService, configUsecases),
14-
new GroqEngineExtension(httpService, configUsecases),
15-
new MistralEngineExtension(httpService, configUsecases),
12+
inject: [HttpService, ConfigsUsecases, EventEmitter2],
13+
useFactory: (
14+
httpService: HttpService,
15+
configUsecases: ConfigsUsecases,
16+
eventEmitter: EventEmitter2,
17+
) => [
18+
new OpenAIEngineExtension(httpService, configUsecases, eventEmitter),
19+
new GroqEngineExtension(httpService, configUsecases, eventEmitter),
20+
new MistralEngineExtension(httpService, configUsecases, eventEmitter),
1621
],
1722
};
1823

1924
@Module({
20-
// Do not import ConfigsModule here to avoid circular dependency
21-
imports: [HttpModule, FileManagerModule],
25+
imports: [HttpModule, ConfigsModule],
2226
controllers: [],
23-
providers: [ConfigsUsecases, provider],
24-
exports: [ConfigsUsecases, provider],
27+
providers: [provider],
28+
exports: [provider],
2529
})
2630
export class ExtensionsModule {}

cortex-js/src/extensions/groq.engine.ts

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { HttpService } from '@nestjs/axios';
22
import { OAIEngineExtension } from '../domain/abstracts/oai.abstract';
33
import { ConfigsUsecases } from '@/usecases/configs/configs.usecase';
4+
import { EventEmitter2 } from '@nestjs/event-emitter';
45

56
/**
67
* A class that implements the InferenceExtension interface from the @janhq/core package.
@@ -18,16 +19,23 @@ export default class GroqEngineExtension extends OAIEngineExtension {
1819
constructor(
1920
protected readonly httpService: HttpService,
2021
protected readonly configsUsecases: ConfigsUsecases,
22+
protected readonly eventEmmitter: EventEmitter2,
2123
) {
2224
super(httpService);
25+
26+
eventEmmitter.on('config.updated', async (data) => {
27+
if (data.group === this.name) {
28+
this.apiKey = data.value;
29+
}
30+
});
2331
}
2432

2533
async onLoad() {
2634
const configs = (await this.configsUsecases.getGroupConfigs(
2735
this.name,
2836
)) as unknown as { apiKey: string };
2937

30-
this.apiKey = configs?.apiKey
38+
this.apiKey = configs?.apiKey;
3139
if (!configs?.apiKey)
3240
await this.configsUsecases.saveConfig('apiKey', '', this.name);
3341
}

cortex-js/src/extensions/mistral.engine.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { HttpService } from '@nestjs/axios';
22
import { OAIEngineExtension } from '../domain/abstracts/oai.abstract';
33
import { ConfigsUsecases } from '@/usecases/configs/configs.usecase';
4+
import { EventEmitter2 } from '@nestjs/event-emitter';
45

56
/**
67
* A class that implements the InferenceExtension interface from the @janhq/core package.
@@ -18,8 +19,15 @@ export default class MistralEngineExtension extends OAIEngineExtension {
1819
constructor(
1920
protected readonly httpService: HttpService,
2021
protected readonly configsUsecases: ConfigsUsecases,
22+
protected readonly eventEmmitter: EventEmitter2,
2123
) {
2224
super(httpService);
25+
26+
eventEmmitter.on('config.updated', async (data) => {
27+
if (data.group === this.name) {
28+
this.apiKey = data.value;
29+
}
30+
});
2331
}
2432

2533
async onLoad() {

cortex-js/src/extensions/openai.engine.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { HttpService } from '@nestjs/axios';
22
import { OAIEngineExtension } from '../domain/abstracts/oai.abstract';
33
import { ConfigsUsecases } from '@/usecases/configs/configs.usecase';
4+
import { EventEmitter2 } from '@nestjs/event-emitter';
45

56
/**
67
* A class that implements the InferenceExtension interface from the @janhq/core package.
@@ -18,8 +19,15 @@ export default class OpenAIEngineExtension extends OAIEngineExtension {
1819
constructor(
1920
protected readonly httpService: HttpService,
2021
protected readonly configsUsecases: ConfigsUsecases,
22+
protected readonly eventEmmitter: EventEmitter2,
2123
) {
2224
super(httpService);
25+
26+
eventEmmitter.on('config.updated', async (data) => {
27+
if (data.group === this.name) {
28+
this.apiKey = data.value;
29+
}
30+
});
2331
}
2432

2533
async onLoad() {

cortex-js/src/usecases/configs/configs.module.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,9 @@
11
import { Module } from '@nestjs/common';
22
import { FileManagerModule } from '@/infrastructure/services/file-manager/file-manager.module';
33
import { ConfigsUsecases } from './configs.usecase';
4-
import { ExtensionModule } from '@/infrastructure/repositories/extensions/extension.module';
54

65
@Module({
7-
imports: [FileManagerModule, ExtensionModule],
6+
imports: [FileManagerModule],
87
controllers: [],
98
providers: [ConfigsUsecases],
109
exports: [ConfigsUsecases],

cortex-js/src/usecases/configs/configs.usecase.ts

Lines changed: 21 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,14 @@
11
import { CommonResponseDto } from '@/infrastructure/dtos/common/common-response.dto';
22
import { FileManagerService } from '@/infrastructure/services/file-manager/file-manager.service';
33
import { Injectable } from '@nestjs/common';
4+
import { EventEmitter2 } from '@nestjs/event-emitter';
45

56
@Injectable()
67
export class ConfigsUsecases {
7-
constructor(private readonly fileManagerService: FileManagerService) {}
8+
constructor(
9+
private readonly fileManagerService: FileManagerService,
10+
private readonly eventEmitter: EventEmitter2,
11+
) {}
812

913
/**
1014
* Save a configuration to the .cortexrc file.
@@ -33,11 +37,22 @@ export class ConfigsUsecases {
3337
: {}),
3438
};
3539

36-
return this.fileManagerService.writeConfigFile(newConfigs).then(() => {
37-
return {
38-
message: 'The config has been successfully updated.',
39-
};
40-
});
40+
return this.fileManagerService
41+
.writeConfigFile(newConfigs)
42+
.then(async () => {
43+
if (group) {
44+
this.eventEmitter.emit('config.updated', {
45+
group,
46+
key,
47+
value,
48+
});
49+
}
50+
})
51+
.then(() => {
52+
return {
53+
message: 'The config has been successfully updated.',
54+
};
55+
});
4156
}
4257

4358
/**

0 commit comments

Comments
 (0)