129 lines
3.8 KiB
TypeScript
129 lines
3.8 KiB
TypeScript
import { ModelAuxSidecar, ModelDraftSidecar, SidecarForm } from '$lib/enums';
|
|
import { HuggingFaceService } from '$lib/services/huggingface.service';
|
|
import { ModelsService } from '$lib/services/models.service';
|
|
import { sidecarFromTag } from '$lib/utils';
|
|
import { describe, expect, it } from 'vitest';
|
|
|
|
const { buildDownloadTag } = ModelsService;
|
|
const { extractQuantMeta } = HuggingFaceService;
|
|
|
|
// the sidecar filename grammar mirrors the server (common/download.cpp):
|
|
// the token must be lowercase, and it can sit at the start, between name
|
|
// segments, or at the end of the file name
|
|
describe('extractQuantMeta', () => {
|
|
it('parses the prefix form', () => {
|
|
expect(extractQuantMeta('mtp-Model-Q4_0.gguf')).toStrictEqual({
|
|
quant: 'Q4_0',
|
|
shared: false,
|
|
sidecar: ModelDraftSidecar.MTP,
|
|
sidecarForm: SidecarForm.PREFIX
|
|
});
|
|
});
|
|
|
|
it('parses the infix form', () => {
|
|
expect(extractQuantMeta('Model-mtp-Q4_0.gguf')).toStrictEqual({
|
|
quant: 'Q4_0',
|
|
shared: false,
|
|
sidecar: ModelDraftSidecar.MTP,
|
|
sidecarForm: SidecarForm.INFIX
|
|
});
|
|
});
|
|
|
|
it('parses the suffix form', () => {
|
|
expect(extractQuantMeta('gemma-4-E2B-it-BF16-mtp.gguf')).toStrictEqual({
|
|
quant: 'BF16',
|
|
shared: false,
|
|
sidecar: ModelDraftSidecar.MTP,
|
|
sidecarForm: SidecarForm.SUFFIX
|
|
});
|
|
});
|
|
|
|
it('parses an uppercase infix token', () => {
|
|
expect(extractQuantMeta('gemma-4-31B-it-MTP-BF16.gguf')).toStrictEqual({
|
|
quant: 'BF16',
|
|
shared: false,
|
|
sidecar: ModelDraftSidecar.MTP,
|
|
sidecarForm: SidecarForm.INFIX
|
|
});
|
|
});
|
|
|
|
it('parses an uppercase trailing token', () => {
|
|
expect(extractQuantMeta('gemma-4-E2B-it-BF16-MTP.gguf')).toStrictEqual({
|
|
quant: 'BF16',
|
|
shared: false,
|
|
sidecar: ModelDraftSidecar.MTP,
|
|
sidecarForm: SidecarForm.SUFFIX
|
|
});
|
|
});
|
|
|
|
it('parses a short-form sidecar with a bare quant', () => {
|
|
expect(extractQuantMeta('mmproj-F16.gguf')).toStrictEqual({
|
|
quant: 'F16',
|
|
shared: false,
|
|
sidecar: ModelAuxSidecar.MMPROJ,
|
|
sidecarForm: SidecarForm.PREFIX
|
|
});
|
|
});
|
|
|
|
it('parses a bare sidecar file', () => {
|
|
expect(extractQuantMeta('imatrix.gguf')).toStrictEqual({
|
|
quant: null,
|
|
shared: false,
|
|
sidecar: ModelAuxSidecar.IMATRIX,
|
|
sidecarForm: SidecarForm.PREFIX
|
|
});
|
|
});
|
|
|
|
it('parses a standalone sidecar with a draft tail', () => {
|
|
expect(extractQuantMeta('Model-mtp-draft.gguf')).toStrictEqual({
|
|
quant: null,
|
|
shared: false,
|
|
sidecar: ModelDraftSidecar.MTP,
|
|
sidecarForm: SidecarForm.SUFFIX
|
|
});
|
|
});
|
|
|
|
it('parses a nested sidecar path by its file name', () => {
|
|
expect(extractQuantMeta('MTP/mtp-Model-Q4_0.gguf')).toStrictEqual({
|
|
quant: 'Q4_0',
|
|
shared: false,
|
|
sidecar: ModelDraftSidecar.MTP,
|
|
sidecarForm: SidecarForm.PREFIX
|
|
});
|
|
});
|
|
|
|
it('returns null for non-weight files', () => {
|
|
expect(extractQuantMeta('README.md')).toBeNull();
|
|
});
|
|
});
|
|
|
|
describe('buildDownloadTag', () => {
|
|
it('appends the quantization', () => {
|
|
expect(buildDownloadTag('org/repo', 'Q4_0', null)).toBe('org/repo:Q4_0');
|
|
});
|
|
|
|
it('appends the quantization and sidecar', () => {
|
|
expect(buildDownloadTag('org/repo', 'Q4_0', ModelDraftSidecar.MTP)).toBe('org/repo:Q4_0-mtp');
|
|
});
|
|
|
|
it('uses the sidecar alone when there is no quant', () => {
|
|
expect(buildDownloadTag('org/repo', null, ModelAuxSidecar.MMPROJ)).toBe('org/repo:mmproj');
|
|
});
|
|
|
|
it('returns the repo id untouched without a tag', () => {
|
|
expect(buildDownloadTag('org/repo', null, null)).toBe('org/repo');
|
|
});
|
|
});
|
|
|
|
describe('sidecarFromTag', () => {
|
|
it('reads the token after the last dash', () => {
|
|
expect(sidecarFromTag('Q4_0-mtp')).toBe(ModelDraftSidecar.MTP);
|
|
expect(sidecarFromTag('mmproj')).toBe(ModelAuxSidecar.MMPROJ);
|
|
});
|
|
|
|
it('returns null for quant-only and unrelated tags', () => {
|
|
expect(sidecarFromTag('Q4_K_XL')).toBeNull();
|
|
expect(sidecarFromTag('UD-Q4_K_XL')).toBeNull();
|
|
});
|
|
});
|