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

Commit 33d9faa

Browse files
committed
refactor: inject model cli use cases - support quantization selection
1 parent fa49df1 commit 33d9faa

File tree

9 files changed

+35
-70
lines changed

9 files changed

+35
-70
lines changed

cortex-js/src/infrastructure/commanders/models/model-get.command.ts

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import { exit } from 'node:process';
55

66
@SubCommand({ name: 'get', description: 'Get a model by ID.' })
77
export class ModelGetCommand extends CommandRunner {
8-
constructor(private readonly modelsUsecases: ModelsUsecases) {
8+
constructor(private readonly modelsCliUsecases: ModelsCliUsecases) {
99
super();
1010
}
1111

@@ -15,8 +15,7 @@ export class ModelGetCommand extends CommandRunner {
1515
exit(1);
1616
}
1717

18-
const modelsCliUsecases = new ModelsCliUsecases(this.modelsUsecases);
19-
const models = await modelsCliUsecases.getModel(input[0]);
18+
const models = await this.modelsCliUsecases.getModel(input[0]);
2019
console.log(models);
2120
}
2221
}

cortex-js/src/infrastructure/commanders/models/model-list.command.ts

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,12 @@ import { ModelsCliUsecases } from '../usecases/models.cli.usecases';
44

55
@SubCommand({ name: 'list', description: 'List all models locally.' })
66
export class ModelListCommand extends CommandRunner {
7-
constructor(private readonly modelsUsecases: ModelsUsecases) {
7+
constructor(private readonly modelsCliUsecases: ModelsCliUsecases) {
88
super();
99
}
1010

1111
async run(): Promise<void> {
12-
const modelsCliUsecases = new ModelsCliUsecases(this.modelsUsecases);
13-
const models = await modelsCliUsecases.listAllModels();
12+
const models = await this.modelsCliUsecases.listAllModels();
1413
console.log(models);
1514
}
1615
}

cortex-js/src/infrastructure/commanders/models/model-pull.command.ts

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
import { ModelsUsecases } from '@/usecases/models/models.usecases';
21
import { CommandRunner, SubCommand } from 'nest-commander';
32
import { Presets, SingleBar } from 'cli-progress';
43
import { exit } from 'node:process';
@@ -10,7 +9,7 @@ import { ModelsCliUsecases } from '../usecases/models.cli.usecases';
109
description: 'Download a model. Working with HuggingFace model id.',
1110
})
1211
export class ModelPullCommand extends CommandRunner {
13-
constructor(private readonly modelsUsecases: ModelsUsecases) {
12+
constructor(private readonly modelsCliUsecases: ModelsCliUsecases) {
1413
super();
1514
}
1615

@@ -25,7 +24,7 @@ export class ModelPullCommand extends CommandRunner {
2524
const callback = (progress: number) => {
2625
bar.update(progress);
2726
};
28-
await new ModelsCliUsecases(this.modelsUsecases).pullModel(
27+
await this.modelsCliUsecases.pullModel(
2928
input[0],
3029
callback,
3130
);
Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,10 @@
1-
import { ModelsUsecases } from '@/usecases/models/models.usecases';
21
import { CommandRunner, SubCommand } from 'nest-commander';
32
import { ModelsCliUsecases } from '../usecases/models.cli.usecases';
43
import { exit } from 'node:process';
54

65
@SubCommand({ name: 'remove', description: 'Remove a model by ID locally.' })
76
export class ModelRemoveCommand extends CommandRunner {
8-
constructor(private readonly modelsUsecases: ModelsUsecases) {
7+
constructor(private readonly modelsCliUsecases: ModelsCliUsecases) {
98
super();
109
}
1110

@@ -15,8 +14,7 @@ export class ModelRemoveCommand extends CommandRunner {
1514
exit(1);
1615
}
1716

18-
const modelsCliUsecases = new ModelsCliUsecases(this.modelsUsecases);
19-
const result = await modelsCliUsecases.removeModel(input[0]);
17+
const result = await this.modelsCliUsecases.removeModel(input[0]);
2018
console.log(result);
2119
}
2220
}

cortex-js/src/infrastructure/commanders/models/model-start.command.ts

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
import { ModelsUsecases } from '@/usecases/models/models.usecases';
21
import { CommandRunner, SubCommand } from 'nest-commander';
32
import { exit } from 'node:process';
43
import { ModelsCliUsecases } from '../usecases/models.cli.usecases';
@@ -7,8 +6,8 @@ import { CortexUsecases } from '@/usecases/cortex/cortex.usecases';
76
@SubCommand({ name: 'start', description: 'Start a model by ID.' })
87
export class ModelStartCommand extends CommandRunner {
98
constructor(
10-
private readonly modelsUsecases: ModelsUsecases,
119
private readonly cortexUsecases: CortexUsecases,
10+
private readonly modelsCliUsecases: ModelsCliUsecases,
1211
) {
1312
super();
1413
}
@@ -20,7 +19,6 @@ export class ModelStartCommand extends CommandRunner {
2019
}
2120

2221
await this.cortexUsecases.startCortex();
23-
const modelsCliUsecases = new ModelsCliUsecases(this.modelsUsecases);
24-
await modelsCliUsecases.startModel(input[0]);
22+
await this.modelsCliUsecases.startModel(input[0]);
2523
}
2624
}
Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
import { ModelsUsecases } from '@/usecases/models/models.usecases';
21
import { CommandRunner, SubCommand } from 'nest-commander';
32
import { exit } from 'node:process';
43
import { ModelsCliUsecases } from '../usecases/models.cli.usecases';
@@ -7,8 +6,8 @@ import { CortexUsecases } from '@/usecases/cortex/cortex.usecases';
76
@SubCommand({ name: 'stop', description: 'Stop a model by ID.' })
87
export class ModelStopCommand extends CommandRunner {
98
constructor(
10-
private readonly modelsUsecases: ModelsUsecases,
119
private readonly cortexUsecases: CortexUsecases,
10+
private readonly modelsCliUsecases: ModelsCliUsecases,
1211
) {
1312
super();
1413
}
@@ -19,8 +18,7 @@ export class ModelStopCommand extends CommandRunner {
1918
exit(1);
2019
}
2120

22-
const modelsCliUsecases = new ModelsCliUsecases(this.modelsUsecases);
23-
await modelsCliUsecases.stopModel(input[0]);
21+
await this.modelsCliUsecases.stopModel(input[0]);
2422
await this.cortexUsecases.stopCortex();
2523
}
2624
}

cortex-js/src/infrastructure/commanders/questions/hugging-face.questions.ts

Lines changed: 0 additions & 40 deletions
This file was deleted.
Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
11
import { Module } from "@nestjs/common";
22
import { InitCliUsecases } from "./init.cli.usecases";
33
import { HttpModule } from "@nestjs/axios";
4+
import { ModelsCliUsecases } from "./models.cli.usecases";
5+
import { ModelsModule } from "@/usecases/models/models.module";
46

57
@Module({
6-
imports: [HttpModule],
8+
imports: [HttpModule, ModelsModule],
79
controllers: [],
8-
providers: [InitCliUsecases],
9-
exports: [InitCliUsecases],
10+
providers: [InitCliUsecases, ModelsCliUsecases],
11+
exports: [InitCliUsecases, ModelsCliUsecases],
1012
})
1113
export class CliUsecasesModule {}

cortex-js/src/infrastructure/commanders/usecases/models.cli.usecases.ts

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ import { Model, ModelFormat } from '@/domain/models/model.interface';
44
import { CreateModelDto } from '@/infrastructure/dtos/models/create-model.dto';
55
import { HuggingFaceRepoData } from '@/domain/models/huggingface.interface';
66
import { gguf } from '@huggingface/gguf';
7+
import { InquirerService } from 'nest-commander';
8+
import { Inject, Injectable } from '@nestjs/common';
79

810
const AllQuantizations = [
911
'Q3_K_S',
@@ -28,9 +30,13 @@ const AllQuantizations = [
2830
'COPY',
2931
];
3032

31-
// TODO: make this class injectable
33+
@Injectable()
3234
export class ModelsCliUsecases {
33-
constructor(private readonly modelsUsecases: ModelsUsecases) {}
35+
constructor(
36+
private readonly modelsUsecases: ModelsUsecases,
37+
@Inject(InquirerService)
38+
private readonly inquirerService: InquirerService,
39+
) {}
3440

3541
async startModel(modelId: string): Promise<void> {
3642
await this.getModelOrStop(modelId);
@@ -75,10 +81,16 @@ export class ModelsCliUsecases {
7581

7682
private async pullHuggingFaceModel(modelId: string) {
7783
const data = await this.fetchHuggingFaceRepoData(modelId);
78-
// TODO: add select options
79-
const sibling = data.siblings.filter(
80-
(e: any) => e.quantization == 'Q5_K_M',
81-
)[0];
84+
const { quantization } = await this.inquirerService.inquirer.prompt({
85+
type: 'list',
86+
name: 'quantization',
87+
message: 'Select quantization',
88+
choices: data.siblings.map((e) => e.quantization).filter((e) => !!e),
89+
});
90+
91+
const sibling = data.siblings.filter((e) => !!e.quantization).find(
92+
(e: any) => e.quantization === quantization,
93+
);
8294

8395
if (!sibling) throw 'No expected quantization found';
8496
const stopWords: string[] = [];

0 commit comments

Comments
 (0)