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

Commit bafe1e8

Browse files
feat: support pull model by specific fileName
1 parent ad545d1 commit bafe1e8

File tree

4 files changed

+42
-7
lines changed

4 files changed

+42
-7
lines changed

cortex-js/src/domain/models/model.event.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ const ModelLoadingEvents = [
88
'starting-failed',
99
'stopping-failed',
1010
'model-downloaded',
11+
'model-downloaded-failed',
1112
'model-deleted',
1213
] as const;
1314
export type ModelLoadingEvent = (typeof ModelLoadingEvents)[number];

cortex-js/src/infrastructure/controllers/models.controller.ts

Lines changed: 25 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@ import {
88
Delete,
99
HttpCode,
1010
UseInterceptors,
11+
Query,
12+
BadRequestException,
1113
} from '@nestjs/common';
1214
import { ModelsUsecases } from '@/usecases/models/models.usecases';
1315
import { CreateModelDto } from '@/infrastructure/dtos/models/create-model.dto';
@@ -26,6 +28,7 @@ import {
2628
} from '@/domain/telemetry/telemetry.interface';
2729
import { TelemetryUsecases } from '@/usecases/telemetry/telemetry.usecases';
2830
import { CommonResponseDto } from '../dtos/common/common-response.dto';
31+
import { HuggingFaceRepoSibling } from '@/domain/models/huggingface.interface';
2932

3033
@ApiTags('Models')
3134
@Controller('models')
@@ -117,8 +120,17 @@ export class ModelsController {
117120
})
118121

119122
@Get('download/:modelId(*)')
120-
downloadModel(@Param('modelId') modelId: string) {
121-
this.modelsUsecases.pullModel(modelId, false).then(() => this.telemetryUsecases.addEventToQueue({
123+
downloadModel(@Param('modelId') modelId: string, @Query('fileName') fileName: string) {
124+
this.modelsUsecases.pullModel(modelId, false, (files) => {
125+
return new Promise<HuggingFaceRepoSibling>(async (resolve, reject) => {
126+
const file = files
127+
.find((e) => e.quantization && e.rfilename === fileName)
128+
if(!file) {
129+
return reject(new BadRequestException('File not found'));
130+
}
131+
return resolve(file);
132+
});
133+
}).then(() => this.telemetryUsecases.addEventToQueue({
122134
name: EventName.DOWNLOAD_MODEL,
123135
modelId,
124136
})
@@ -162,8 +174,17 @@ export class ModelsController {
162174
description: 'The unique identifier of the model.',
163175
})
164176
@Get('pull/:modelId(*)')
165-
pullModel(@Param('modelId') modelId: string) {
166-
this.modelsUsecases.pullModel(modelId).then(() => this.telemetryUsecases.addEventToQueue({
177+
pullModel(@Param('modelId') modelId: string, @Query('fileName') fileName: string) {
178+
this.modelsUsecases.pullModel(modelId, false, (files) => {
179+
return new Promise<HuggingFaceRepoSibling>(async (resolve, reject) => {
180+
const file = files
181+
.find((e) => e.quantization && e.rfilename === fileName)
182+
if(!file) {
183+
return reject(new BadRequestException('File not found'));
184+
}
185+
return resolve(file);
186+
});
187+
}).then(() => this.telemetryUsecases.addEventToQueue({
167188
name: EventName.DOWNLOAD_MODEL,
168189
modelId,
169190
})

cortex-js/src/usecases/models/models.usecases.ts

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -342,10 +342,21 @@ export class ModelsUsecases {
342342
await promises.mkdir(modelFolder, { recursive: true }).catch(() => {});
343343

344344
let files = (await fetchJanRepoData(modelId)).siblings;
345-
345+
346346
// HuggingFace GGUF Repo - Only one file is downloaded
347347
if (modelId.includes('/') && selection && files.length) {
348+
try {
348349
files = [await selection(files)];
350+
} catch (e) {
351+
const modelEvent: ModelEvent = {
352+
model: modelId,
353+
event: 'model-downloaded-failed',
354+
metadata: {
355+
error: e.message || e,
356+
},
357+
};
358+
this.eventEmitter.emit('model.event', modelEvent);
359+
}
349360
}
350361

351362
// Start downloading the model
@@ -420,7 +431,9 @@ export class ModelsUsecases {
420431
const modelEvent: ModelEvent = {
421432
model: modelId,
422433
event: 'model-downloaded',
423-
metadata: {},
434+
metadata: {
435+
...(selection ? { file: [files] } : {}),
436+
},
424437
};
425438
this.eventEmitter.emit('model.event', modelEvent);
426439
},

cortex-js/src/utils/model-check.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ export const checkModelCompatibility = async (modelId: string, spinner?: ora.Ora
2121
process.exit(1);
2222
}
2323

24-
try{
24+
try {
2525
const version = await getCudaVersion();
2626
const [currentMajor, currentMinor] = version.split('.').map(Number);
2727
const [requiredMajor, requiredMinor] = MIN_CUDA_VERSION.split('.').map(Number);

0 commit comments

Comments
 (0)