@huggingface/tasks 0.20.23 → 0.20.24

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"hardware-amd.d.ts","sourceRoot":"","sources":["../../src/hardware-amd.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAElD,MAAM,WAAW,kBAAmB,SAAQ,YAAY;IACvD;;;;OAIG;IACH,UAAU,EAAE,MAAM,CAAC;CACnB;AAED,eAAO,MAAM,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,kBAAkB,CAwI3D,CAAC"}
1
+ {"version":3,"file":"hardware-amd.d.ts","sourceRoot":"","sources":["../../src/hardware-amd.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAElD,MAAM,WAAW,kBAAmB,SAAQ,YAAY;IACvD;;;;OAIG;IACH,UAAU,EAAE,MAAM,CAAC;CACnB;AAED,eAAO,MAAM,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,kBAAkB,CAkJ3D,CAAC"}
@@ -52,6 +52,16 @@ exports.AMD_GPU_SKUS = {
52
52
  memory: [8, 16],
53
53
  gfxVersion: "gfx1200",
54
54
  },
55
+ "PRO W7900": {
56
+ tflops: 122.6,
57
+ memory: [48],
58
+ gfxVersion: "gfx1100",
59
+ },
60
+ "PRO W7800": {
61
+ tflops: 90.5,
62
+ memory: [32, 48],
63
+ gfxVersion: "gfx1100",
64
+ },
55
65
  "RX 7900 XTX": {
56
66
  tflops: 122.8,
57
67
  memory: [24],
@@ -67,6 +67,7 @@ declare function isLlamaCppGgufModel(model: ModelData): boolean;
67
67
  declare function isVllmModel(model: ModelData): boolean;
68
68
  declare function isDockerModelRunnerModel(model: ModelData): boolean;
69
69
  declare function isUnslothModel(model: ModelData): boolean;
70
+ declare function isToolCallingLocalAgentModel(model: ModelData): boolean;
70
71
  /**
71
72
  * Add your new local app here.
72
73
  *
@@ -241,7 +242,14 @@ export declare const LOCAL_APPS: {
241
242
  prettyLabel: string;
242
243
  docsUrl: string;
243
244
  mainTask: "text-generation";
244
- displayOnModelPage: (model: ModelData) => boolean;
245
+ displayOnModelPage: typeof isToolCallingLocalAgentModel;
246
+ snippet: (model: ModelData, filepath?: string) => LocalAppSnippet[];
247
+ };
248
+ "hermes-agent": {
249
+ prettyLabel: string;
250
+ docsUrl: string;
251
+ mainTask: "text-generation";
252
+ displayOnModelPage: typeof isToolCallingLocalAgentModel;
245
253
  snippet: (model: ModelData, filepath?: string) => LocalAppSnippet[];
246
254
  };
247
255
  };
@@ -1 +1 @@
1
- {"version":3,"file":"local-apps.d.ts","sourceRoot":"","sources":["../../src/local-apps.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAKnD,MAAM,WAAW,eAAe;IAC/B;;OAEG;IACH,KAAK,EAAE,MAAM,CAAC;IACd;;OAEG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;OAEG;IACH,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;CAC3B;AAED;;GAEG;AACH,MAAM,MAAM,QAAQ,GAAG;IACtB;;OAEG;IACH,WAAW,EAAE,MAAM,CAAC;IACpB;;OAEG;IACH,OAAO,EAAE,MAAM,CAAC;IAChB;;OAEG;IACH,KAAK,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,EAAE,GAAG,CAAC,CAAC,KAAK,EAAE,SAAS,KAAK;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC,CAAC;IACpG;;OAEG;IACH,QAAQ,EAAE,YAAY,CAAC;IACvB;;OAEG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IAEpB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB;;OAEG;IACH,kBAAkB,EAAE,CAAC,KAAK,EAAE,SAAS,KAAK,OAAO,CAAC;CAClD,GAAG,CACD;IACA;;OAEG;IACH,QAAQ,EAAE,CAAC,KAAK,EAAE,SAAS,EAAE,QAAQ,CAAC,EAAE,MAAM,KAAK,GAAG,CAAC;CACtD,GACD;IACA;;;;OAIG;IACH,OAAO,EAAE,CAAC,KAAK,EAAE,SAAS,EAAE,QAAQ,CAAC,EAAE,MAAM,KAAK,MAAM,GAAG,MAAM,EAAE,GAAG,eAAe,GAAG,eAAe,EAAE,CAAC;CACzG,CACH,CAAC;AAsBF,iBAAS,UAAU,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO,CAE7C;AAED,iBAAS,mBAAmB,CAAC,KAAK,EAAE,SAAS,WAE5C;AAED,iBAAS,WAAW,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO,CAU9C;AAED,iBAAS,wBAAwB,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO,CAE3D;AA0BD,iBAAS,cAAc,CAAC,KAAK,EAAE,SAAS,WAEvC;AAiaD;;;;;;;;;;GAUG;AACH,eAAO,MAAM,UAAU;;;;;;yBA/ZS,SAAS,aAAa,MAAM,KAAG,eAAe,EAAE;;;;;;;yBAiDzC,SAAS,aAAa,MAAM,KAAG,eAAe,EAAE;;;;;;;yBA2F3D,SAAS,KAAG,eAAe,EAAE;;;;;;oCA6S3B,SAAS;yBAvPT,SAAS,KAAG,eAAe,EAAE;;;;;;;yBAoF9B,SAAS,KAAG,eAAe,EAAE;;;;;;;yBA7B/B,SAAS,KAAG,eAAe,EAAE;;;;;;;;;;;;;;yBApIzB,SAAS,aAAa,MAAM,KAAG,eAAe,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;yBAtDjD,SAAS,aAAa,MAAM,KAAG,MAAM;;;;;;;yBAIpC,SAAS,KAAG,eAAe,EAAE;;;;;;;yBAqSnB,SAAS,aAAa,MAAM,KAAG,MAAM;;;;;;;yBAM9C,SAAS,aAAa,MAAM,KAAG,eAAe,EAAE;;;;;;;yBArDtD,SAAS,aAAa,MAAM,KAAG,eAAe,EAAE;;CA0StC,CAAC;AAErC,MAAM,MAAM,WAAW,GAAG,MAAM,OAAO,UAAU,CAAC"}
1
+ {"version":3,"file":"local-apps.d.ts","sourceRoot":"","sources":["../../src/local-apps.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAKnD,MAAM,WAAW,eAAe;IAC/B;;OAEG;IACH,KAAK,EAAE,MAAM,CAAC;IACd;;OAEG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;OAEG;IACH,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;CAC3B;AAED;;GAEG;AACH,MAAM,MAAM,QAAQ,GAAG;IACtB;;OAEG;IACH,WAAW,EAAE,MAAM,CAAC;IACpB;;OAEG;IACH,OAAO,EAAE,MAAM,CAAC;IAChB;;OAEG;IACH,KAAK,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,EAAE,GAAG,CAAC,CAAC,KAAK,EAAE,SAAS,KAAK;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC,CAAC;IACpG;;OAEG;IACH,QAAQ,EAAE,YAAY,CAAC;IACvB;;OAEG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IAEpB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB;;OAEG;IACH,kBAAkB,EAAE,CAAC,KAAK,EAAE,SAAS,KAAK,OAAO,CAAC;CAClD,GAAG,CACD;IACA;;OAEG;IACH,QAAQ,EAAE,CAAC,KAAK,EAAE,SAAS,EAAE,QAAQ,CAAC,EAAE,MAAM,KAAK,GAAG,CAAC;CACtD,GACD;IACA;;;;OAIG;IACH,OAAO,EAAE,CAAC,KAAK,EAAE,SAAS,EAAE,QAAQ,CAAC,EAAE,MAAM,KAAK,MAAM,GAAG,MAAM,EAAE,GAAG,eAAe,GAAG,eAAe,EAAE,CAAC;CACzG,CACH,CAAC;AAsBF,iBAAS,UAAU,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO,CAE7C;AAED,iBAAS,mBAAmB,CAAC,KAAK,EAAE,SAAS,WAE5C;AAED,iBAAS,WAAW,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO,CAU9C;AAED,iBAAS,wBAAwB,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO,CAE3D;AA0BD,iBAAS,cAAc,CAAC,KAAK,EAAE,SAAS,WAEvC;AAED,iBAAS,4BAA4B,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO,CAM/D;AA6bD;;;;;;;;;;GAUG;AACH,eAAO,MAAM,UAAU;;;;;;yBA3bS,SAAS,aAAa,MAAM,KAAG,eAAe,EAAE;;;;;;;yBAiDzC,SAAS,aAAa,MAAM,KAAG,eAAe,EAAE;;;;;;;yBA2F3D,SAAS,KAAG,eAAe,EAAE;;;;;;oCAyU3B,SAAS;yBAnRT,SAAS,KAAG,eAAe,EAAE;;;;;;;yBAoF9B,SAAS,KAAG,eAAe,EAAE;;;;;;;yBA7B/B,SAAS,KAAG,eAAe,EAAE;;;;;;;;;;;;;;yBApIzB,SAAS,aAAa,MAAM,KAAG,eAAe,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;yBAtDjD,SAAS,aAAa,MAAM,KAAG,MAAM;;;;;;;yBAIpC,SAAS,KAAG,eAAe,EAAE;;;;;;;yBAiUnB,SAAS,aAAa,MAAM,KAAG,MAAM;;;;;;;yBAM9C,SAAS,aAAa,MAAM,KAAG,eAAe,EAAE;;;;;;;yBAnEtD,SAAS,aAAa,MAAM,KAAG,eAAe,EAAE;;;;;;;yBAkCvC,SAAS,aAAa,MAAM,KAAG,eAAe,EAAE;;CA0R/C,CAAC;AAErC,MAAM,MAAM,WAAW,GAAG,MAAM,OAAO,UAAU,CAAC"}
@@ -60,6 +60,11 @@ function getChatTemplate(model) {
60
60
  function isUnslothModel(model) {
61
61
  return model.tags.includes("unsloth") || isLlamaCppGgufModel(model);
62
62
  }
63
+ function isToolCallingLocalAgentModel(model) {
64
+ return ((isLlamaCppGgufModel(model) || isMlxModel(model)) &&
65
+ model.tags.includes("conversational") &&
66
+ !!getChatTemplate(model)?.includes("tools"));
67
+ }
63
68
  function getQuantTag(filepath) {
64
69
  const defaultTag = ":{{QUANT_TAG}}";
65
70
  if (!filepath) {
@@ -357,11 +362,8 @@ const snippetMlxLm = (model) => {
357
362
  : []),
358
363
  ];
359
364
  };
360
- const snippetPi = (model, filepath) => {
361
- const modelName = model.id.split("/").pop() ?? model.id;
362
- const isMLX = isMlxModel(model);
363
- // Step 1: Server — differs by backend
364
- const serverStep = isMLX
365
+ const getLocalServerStep = (model, filepath) => {
366
+ return isMlxModel(model)
365
367
  ? {
366
368
  title: "Start the MLX server",
367
369
  setup: "# Install MLX LM:\nuv tool install mlx-lm",
@@ -372,14 +374,18 @@ const snippetPi = (model, filepath) => {
372
374
  setup: "# Install llama.cpp:\nbrew install llama.cpp",
373
375
  content: `# Start a local OpenAI-compatible server:\nllama-server -hf ${model.id}${getQuantTag(filepath)}`,
374
376
  };
375
- // Step 2: Pi config — port and provider name differ
377
+ };
378
+ const snippetPi = (model, filepath) => {
379
+ const isMLX = isMlxModel(model);
380
+ const modelId = isMLX ? model.id : `${model.id}${getQuantTag(filepath)}`;
381
+ const serverStep = getLocalServerStep(model, filepath);
376
382
  const modelsJson = JSON.stringify({
377
383
  providers: {
378
384
  [isMLX ? "mlx-lm" : "llama-cpp"]: {
379
385
  baseUrl: "http://localhost:8080/v1",
380
386
  api: "openai-completions",
381
387
  apiKey: "none",
382
- models: [{ id: isMLX ? model.id : modelName }],
388
+ models: [{ id: modelId }],
383
389
  },
384
390
  },
385
391
  }, null, 2);
@@ -396,6 +402,31 @@ const snippetPi = (model, filepath) => {
396
402
  },
397
403
  ];
398
404
  };
405
+ const snippetHermesAgent = (model, filepath) => {
406
+ const modelId = isMlxModel(model) ? model.id : `${model.id}${getQuantTag(filepath)}`;
407
+ const serverStep = getLocalServerStep(model, filepath);
408
+ return [
409
+ serverStep,
410
+ {
411
+ title: "Configure Hermes",
412
+ setup: [
413
+ "# Install Hermes:",
414
+ "curl -fsSL https://hermes-agent.nousresearch.com/install.sh | bash",
415
+ "hermes setup",
416
+ ].join("\n"),
417
+ content: [
418
+ "# Point Hermes at the local server:",
419
+ "hermes config set model.provider custom",
420
+ "hermes config set model.base_url http://127.0.0.1:8080/v1",
421
+ `hermes config set model.default ${modelId}`,
422
+ ].join("\n"),
423
+ },
424
+ {
425
+ title: "Run Hermes",
426
+ content: "hermes",
427
+ },
428
+ ];
429
+ };
399
430
  const snippetDockerModelRunner = (model, filepath) => {
400
431
  // Only add quant tag for GGUF models, not safetensors
401
432
  const quantTag = isLlamaCppGgufModel(model) ? getQuantTag(filepath) : "";
@@ -636,9 +667,14 @@ exports.LOCAL_APPS = {
636
667
  prettyLabel: "Pi",
637
668
  docsUrl: "https://github.com/badlogic/pi-mono",
638
669
  mainTask: "text-generation",
639
- displayOnModelPage: (model) => (isLlamaCppGgufModel(model) || isMlxModel(model)) &&
640
- model.tags.includes("conversational") &&
641
- !!getChatTemplate(model)?.includes("tools"),
670
+ displayOnModelPage: isToolCallingLocalAgentModel,
642
671
  snippet: snippetPi,
643
672
  },
673
+ "hermes-agent": {
674
+ prettyLabel: "Hermes Agent",
675
+ docsUrl: "https://hermes-agent.nousresearch.com/",
676
+ mainTask: "text-generation",
677
+ displayOnModelPage: isToolCallingLocalAgentModel,
678
+ snippet: snippetHermesAgent,
679
+ },
644
680
  };
@@ -123,7 +123,7 @@ curl -X POST "http://localhost:8000/v1/chat/completions" \\
123
123
  const snippet = snippetFunc(model);
124
124
  (0, vitest_1.expect)(snippet[0].content).toContain(`llama-server -hf bartowski/Llama-3.2-3B-Instruct-GGUF:{{QUANT_TAG}}`);
125
125
  (0, vitest_1.expect)(snippet[1].setup).toContain("npm install -g @mariozechner/pi-coding-agent");
126
- (0, vitest_1.expect)(snippet[1].content).toContain(`"id": "Llama-3.2-3B-Instruct-GGUF"`);
126
+ (0, vitest_1.expect)(snippet[1].content).toContain(`"id": "bartowski/Llama-3.2-3B-Instruct-GGUF:{{QUANT_TAG}}"`);
127
127
  (0, vitest_1.expect)(snippet[2].content).toContain("pi");
128
128
  });
129
129
  (0, vitest_1.it)("pi - mlx", async () => {
@@ -147,6 +147,40 @@ curl -X POST "http://localhost:8000/v1/chat/completions" \\
147
147
  (0, vitest_1.expect)(snippet[1].content).toContain('"id": "mlx-community/Llama-3.2-3B-Instruct-mlx"');
148
148
  (0, vitest_1.expect)(snippet[2].content).toContain("pi");
149
149
  });
150
+ (0, vitest_1.it)("hermes-agent", async () => {
151
+ const { snippet: snippetFunc } = local_apps_js_1.LOCAL_APPS["hermes-agent"];
152
+ const model = {
153
+ id: "bartowski/Llama-3.2-3B-Instruct-GGUF",
154
+ tags: ["conversational"],
155
+ gguf: { total: 1, context_length: 4096, chat_template: "{% if tools %}" },
156
+ inference: "",
157
+ };
158
+ const snippet = snippetFunc(model);
159
+ (0, vitest_1.expect)(snippet[0].content).toContain(`llama-server -hf bartowski/Llama-3.2-3B-Instruct-GGUF:{{QUANT_TAG}}`);
160
+ (0, vitest_1.expect)(snippet[1].content).toContain("hermes config set model.provider custom");
161
+ (0, vitest_1.expect)(snippet[1].content).toContain("hermes config set model.base_url http://127.0.0.1:8080/v1");
162
+ (0, vitest_1.expect)(snippet[1].content).toContain("hermes config set model.default bartowski/Llama-3.2-3B-Instruct-GGUF:{{QUANT_TAG}}");
163
+ (0, vitest_1.expect)(snippet[2].content).toContain("hermes");
164
+ });
165
+ (0, vitest_1.it)("hermes-agent - mlx", async () => {
166
+ const { snippet: snippetFunc } = local_apps_js_1.LOCAL_APPS["hermes-agent"];
167
+ const model = {
168
+ id: "mlx-community/Llama-3.2-3B-Instruct-mlx",
169
+ tags: ["mlx", "conversational"],
170
+ pipeline_tag: "text-generation",
171
+ config: {
172
+ tokenizer_config: {
173
+ chat_template: "{% if tools %}...{% endif %}",
174
+ },
175
+ },
176
+ inference: "",
177
+ };
178
+ const snippet = snippetFunc(model);
179
+ (0, vitest_1.expect)(snippet[0].setup).toContain("uv tool install mlx-lm");
180
+ (0, vitest_1.expect)(snippet[1].content).toContain("hermes config set model.provider custom");
181
+ (0, vitest_1.expect)(snippet[1].content).toContain("hermes config set model.default mlx-community/Llama-3.2-3B-Instruct-mlx");
182
+ (0, vitest_1.expect)(snippet[2].content).toContain("hermes");
183
+ });
150
184
  (0, vitest_1.it)("docker model runner", async () => {
151
185
  const { snippet: snippetFunc } = local_apps_js_1.LOCAL_APPS["docker-model-runner"];
152
186
  const model = {
@@ -1 +1 @@
1
- {"version":3,"file":"hardware-amd.d.ts","sourceRoot":"","sources":["../../src/hardware-amd.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAElD,MAAM,WAAW,kBAAmB,SAAQ,YAAY;IACvD;;;;OAIG;IACH,UAAU,EAAE,MAAM,CAAC;CACnB;AAED,eAAO,MAAM,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,kBAAkB,CAwI3D,CAAC"}
1
+ {"version":3,"file":"hardware-amd.d.ts","sourceRoot":"","sources":["../../src/hardware-amd.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAElD,MAAM,WAAW,kBAAmB,SAAQ,YAAY;IACvD;;;;OAIG;IACH,UAAU,EAAE,MAAM,CAAC;CACnB;AAED,eAAO,MAAM,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,kBAAkB,CAkJ3D,CAAC"}
@@ -49,6 +49,16 @@ export const AMD_GPU_SKUS = {
49
49
  memory: [8, 16],
50
50
  gfxVersion: "gfx1200",
51
51
  },
52
+ "PRO W7900": {
53
+ tflops: 122.6,
54
+ memory: [48],
55
+ gfxVersion: "gfx1100",
56
+ },
57
+ "PRO W7800": {
58
+ tflops: 90.5,
59
+ memory: [32, 48],
60
+ gfxVersion: "gfx1100",
61
+ },
52
62
  "RX 7900 XTX": {
53
63
  tflops: 122.8,
54
64
  memory: [24],
@@ -67,6 +67,7 @@ declare function isLlamaCppGgufModel(model: ModelData): boolean;
67
67
  declare function isVllmModel(model: ModelData): boolean;
68
68
  declare function isDockerModelRunnerModel(model: ModelData): boolean;
69
69
  declare function isUnslothModel(model: ModelData): boolean;
70
+ declare function isToolCallingLocalAgentModel(model: ModelData): boolean;
70
71
  /**
71
72
  * Add your new local app here.
72
73
  *
@@ -241,7 +242,14 @@ export declare const LOCAL_APPS: {
241
242
  prettyLabel: string;
242
243
  docsUrl: string;
243
244
  mainTask: "text-generation";
244
- displayOnModelPage: (model: ModelData) => boolean;
245
+ displayOnModelPage: typeof isToolCallingLocalAgentModel;
246
+ snippet: (model: ModelData, filepath?: string) => LocalAppSnippet[];
247
+ };
248
+ "hermes-agent": {
249
+ prettyLabel: string;
250
+ docsUrl: string;
251
+ mainTask: "text-generation";
252
+ displayOnModelPage: typeof isToolCallingLocalAgentModel;
245
253
  snippet: (model: ModelData, filepath?: string) => LocalAppSnippet[];
246
254
  };
247
255
  };
@@ -1 +1 @@
1
- {"version":3,"file":"local-apps.d.ts","sourceRoot":"","sources":["../../src/local-apps.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAKnD,MAAM,WAAW,eAAe;IAC/B;;OAEG;IACH,KAAK,EAAE,MAAM,CAAC;IACd;;OAEG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;OAEG;IACH,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;CAC3B;AAED;;GAEG;AACH,MAAM,MAAM,QAAQ,GAAG;IACtB;;OAEG;IACH,WAAW,EAAE,MAAM,CAAC;IACpB;;OAEG;IACH,OAAO,EAAE,MAAM,CAAC;IAChB;;OAEG;IACH,KAAK,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,EAAE,GAAG,CAAC,CAAC,KAAK,EAAE,SAAS,KAAK;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC,CAAC;IACpG;;OAEG;IACH,QAAQ,EAAE,YAAY,CAAC;IACvB;;OAEG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IAEpB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB;;OAEG;IACH,kBAAkB,EAAE,CAAC,KAAK,EAAE,SAAS,KAAK,OAAO,CAAC;CAClD,GAAG,CACD;IACA;;OAEG;IACH,QAAQ,EAAE,CAAC,KAAK,EAAE,SAAS,EAAE,QAAQ,CAAC,EAAE,MAAM,KAAK,GAAG,CAAC;CACtD,GACD;IACA;;;;OAIG;IACH,OAAO,EAAE,CAAC,KAAK,EAAE,SAAS,EAAE,QAAQ,CAAC,EAAE,MAAM,KAAK,MAAM,GAAG,MAAM,EAAE,GAAG,eAAe,GAAG,eAAe,EAAE,CAAC;CACzG,CACH,CAAC;AAsBF,iBAAS,UAAU,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO,CAE7C;AAED,iBAAS,mBAAmB,CAAC,KAAK,EAAE,SAAS,WAE5C;AAED,iBAAS,WAAW,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO,CAU9C;AAED,iBAAS,wBAAwB,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO,CAE3D;AA0BD,iBAAS,cAAc,CAAC,KAAK,EAAE,SAAS,WAEvC;AAiaD;;;;;;;;;;GAUG;AACH,eAAO,MAAM,UAAU;;;;;;yBA/ZS,SAAS,aAAa,MAAM,KAAG,eAAe,EAAE;;;;;;;yBAiDzC,SAAS,aAAa,MAAM,KAAG,eAAe,EAAE;;;;;;;yBA2F3D,SAAS,KAAG,eAAe,EAAE;;;;;;oCA6S3B,SAAS;yBAvPT,SAAS,KAAG,eAAe,EAAE;;;;;;;yBAoF9B,SAAS,KAAG,eAAe,EAAE;;;;;;;yBA7B/B,SAAS,KAAG,eAAe,EAAE;;;;;;;;;;;;;;yBApIzB,SAAS,aAAa,MAAM,KAAG,eAAe,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;yBAtDjD,SAAS,aAAa,MAAM,KAAG,MAAM;;;;;;;yBAIpC,SAAS,KAAG,eAAe,EAAE;;;;;;;yBAqSnB,SAAS,aAAa,MAAM,KAAG,MAAM;;;;;;;yBAM9C,SAAS,aAAa,MAAM,KAAG,eAAe,EAAE;;;;;;;yBArDtD,SAAS,aAAa,MAAM,KAAG,eAAe,EAAE;;CA0StC,CAAC;AAErC,MAAM,MAAM,WAAW,GAAG,MAAM,OAAO,UAAU,CAAC"}
1
+ {"version":3,"file":"local-apps.d.ts","sourceRoot":"","sources":["../../src/local-apps.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAKnD,MAAM,WAAW,eAAe;IAC/B;;OAEG;IACH,KAAK,EAAE,MAAM,CAAC;IACd;;OAEG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;OAEG;IACH,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;CAC3B;AAED;;GAEG;AACH,MAAM,MAAM,QAAQ,GAAG;IACtB;;OAEG;IACH,WAAW,EAAE,MAAM,CAAC;IACpB;;OAEG;IACH,OAAO,EAAE,MAAM,CAAC;IAChB;;OAEG;IACH,KAAK,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,EAAE,GAAG,CAAC,CAAC,KAAK,EAAE,SAAS,KAAK;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC,CAAC;IACpG;;OAEG;IACH,QAAQ,EAAE,YAAY,CAAC;IACvB;;OAEG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IAEpB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB;;OAEG;IACH,kBAAkB,EAAE,CAAC,KAAK,EAAE,SAAS,KAAK,OAAO,CAAC;CAClD,GAAG,CACD;IACA;;OAEG;IACH,QAAQ,EAAE,CAAC,KAAK,EAAE,SAAS,EAAE,QAAQ,CAAC,EAAE,MAAM,KAAK,GAAG,CAAC;CACtD,GACD;IACA;;;;OAIG;IACH,OAAO,EAAE,CAAC,KAAK,EAAE,SAAS,EAAE,QAAQ,CAAC,EAAE,MAAM,KAAK,MAAM,GAAG,MAAM,EAAE,GAAG,eAAe,GAAG,eAAe,EAAE,CAAC;CACzG,CACH,CAAC;AAsBF,iBAAS,UAAU,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO,CAE7C;AAED,iBAAS,mBAAmB,CAAC,KAAK,EAAE,SAAS,WAE5C;AAED,iBAAS,WAAW,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO,CAU9C;AAED,iBAAS,wBAAwB,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO,CAE3D;AA0BD,iBAAS,cAAc,CAAC,KAAK,EAAE,SAAS,WAEvC;AAED,iBAAS,4BAA4B,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO,CAM/D;AA6bD;;;;;;;;;;GAUG;AACH,eAAO,MAAM,UAAU;;;;;;yBA3bS,SAAS,aAAa,MAAM,KAAG,eAAe,EAAE;;;;;;;yBAiDzC,SAAS,aAAa,MAAM,KAAG,eAAe,EAAE;;;;;;;yBA2F3D,SAAS,KAAG,eAAe,EAAE;;;;;;oCAyU3B,SAAS;yBAnRT,SAAS,KAAG,eAAe,EAAE;;;;;;;yBAoF9B,SAAS,KAAG,eAAe,EAAE;;;;;;;yBA7B/B,SAAS,KAAG,eAAe,EAAE;;;;;;;;;;;;;;yBApIzB,SAAS,aAAa,MAAM,KAAG,eAAe,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;yBAtDjD,SAAS,aAAa,MAAM,KAAG,MAAM;;;;;;;yBAIpC,SAAS,KAAG,eAAe,EAAE;;;;;;;yBAiUnB,SAAS,aAAa,MAAM,KAAG,MAAM;;;;;;;yBAM9C,SAAS,aAAa,MAAM,KAAG,eAAe,EAAE;;;;;;;yBAnEtD,SAAS,aAAa,MAAM,KAAG,eAAe,EAAE;;;;;;;yBAkCvC,SAAS,aAAa,MAAM,KAAG,eAAe,EAAE;;CA0R/C,CAAC;AAErC,MAAM,MAAM,WAAW,GAAG,MAAM,OAAO,UAAU,CAAC"}
@@ -57,6 +57,11 @@ function getChatTemplate(model) {
57
57
  function isUnslothModel(model) {
58
58
  return model.tags.includes("unsloth") || isLlamaCppGgufModel(model);
59
59
  }
60
+ function isToolCallingLocalAgentModel(model) {
61
+ return ((isLlamaCppGgufModel(model) || isMlxModel(model)) &&
62
+ model.tags.includes("conversational") &&
63
+ !!getChatTemplate(model)?.includes("tools"));
64
+ }
60
65
  function getQuantTag(filepath) {
61
66
  const defaultTag = ":{{QUANT_TAG}}";
62
67
  if (!filepath) {
@@ -354,11 +359,8 @@ const snippetMlxLm = (model) => {
354
359
  : []),
355
360
  ];
356
361
  };
357
- const snippetPi = (model, filepath) => {
358
- const modelName = model.id.split("/").pop() ?? model.id;
359
- const isMLX = isMlxModel(model);
360
- // Step 1: Server — differs by backend
361
- const serverStep = isMLX
362
+ const getLocalServerStep = (model, filepath) => {
363
+ return isMlxModel(model)
362
364
  ? {
363
365
  title: "Start the MLX server",
364
366
  setup: "# Install MLX LM:\nuv tool install mlx-lm",
@@ -369,14 +371,18 @@ const snippetPi = (model, filepath) => {
369
371
  setup: "# Install llama.cpp:\nbrew install llama.cpp",
370
372
  content: `# Start a local OpenAI-compatible server:\nllama-server -hf ${model.id}${getQuantTag(filepath)}`,
371
373
  };
372
- // Step 2: Pi config — port and provider name differ
374
+ };
375
+ const snippetPi = (model, filepath) => {
376
+ const isMLX = isMlxModel(model);
377
+ const modelId = isMLX ? model.id : `${model.id}${getQuantTag(filepath)}`;
378
+ const serverStep = getLocalServerStep(model, filepath);
373
379
  const modelsJson = JSON.stringify({
374
380
  providers: {
375
381
  [isMLX ? "mlx-lm" : "llama-cpp"]: {
376
382
  baseUrl: "http://localhost:8080/v1",
377
383
  api: "openai-completions",
378
384
  apiKey: "none",
379
- models: [{ id: isMLX ? model.id : modelName }],
385
+ models: [{ id: modelId }],
380
386
  },
381
387
  },
382
388
  }, null, 2);
@@ -393,6 +399,31 @@ const snippetPi = (model, filepath) => {
393
399
  },
394
400
  ];
395
401
  };
402
+ const snippetHermesAgent = (model, filepath) => {
403
+ const modelId = isMlxModel(model) ? model.id : `${model.id}${getQuantTag(filepath)}`;
404
+ const serverStep = getLocalServerStep(model, filepath);
405
+ return [
406
+ serverStep,
407
+ {
408
+ title: "Configure Hermes",
409
+ setup: [
410
+ "# Install Hermes:",
411
+ "curl -fsSL https://hermes-agent.nousresearch.com/install.sh | bash",
412
+ "hermes setup",
413
+ ].join("\n"),
414
+ content: [
415
+ "# Point Hermes at the local server:",
416
+ "hermes config set model.provider custom",
417
+ "hermes config set model.base_url http://127.0.0.1:8080/v1",
418
+ `hermes config set model.default ${modelId}`,
419
+ ].join("\n"),
420
+ },
421
+ {
422
+ title: "Run Hermes",
423
+ content: "hermes",
424
+ },
425
+ ];
426
+ };
396
427
  const snippetDockerModelRunner = (model, filepath) => {
397
428
  // Only add quant tag for GGUF models, not safetensors
398
429
  const quantTag = isLlamaCppGgufModel(model) ? getQuantTag(filepath) : "";
@@ -633,9 +664,14 @@ export const LOCAL_APPS = {
633
664
  prettyLabel: "Pi",
634
665
  docsUrl: "https://github.com/badlogic/pi-mono",
635
666
  mainTask: "text-generation",
636
- displayOnModelPage: (model) => (isLlamaCppGgufModel(model) || isMlxModel(model)) &&
637
- model.tags.includes("conversational") &&
638
- !!getChatTemplate(model)?.includes("tools"),
667
+ displayOnModelPage: isToolCallingLocalAgentModel,
639
668
  snippet: snippetPi,
640
669
  },
670
+ "hermes-agent": {
671
+ prettyLabel: "Hermes Agent",
672
+ docsUrl: "https://hermes-agent.nousresearch.com/",
673
+ mainTask: "text-generation",
674
+ displayOnModelPage: isToolCallingLocalAgentModel,
675
+ snippet: snippetHermesAgent,
676
+ },
641
677
  };
@@ -121,7 +121,7 @@ curl -X POST "http://localhost:8000/v1/chat/completions" \\
121
121
  const snippet = snippetFunc(model);
122
122
  expect(snippet[0].content).toContain(`llama-server -hf bartowski/Llama-3.2-3B-Instruct-GGUF:{{QUANT_TAG}}`);
123
123
  expect(snippet[1].setup).toContain("npm install -g @mariozechner/pi-coding-agent");
124
- expect(snippet[1].content).toContain(`"id": "Llama-3.2-3B-Instruct-GGUF"`);
124
+ expect(snippet[1].content).toContain(`"id": "bartowski/Llama-3.2-3B-Instruct-GGUF:{{QUANT_TAG}}"`);
125
125
  expect(snippet[2].content).toContain("pi");
126
126
  });
127
127
  it("pi - mlx", async () => {
@@ -145,6 +145,40 @@ curl -X POST "http://localhost:8000/v1/chat/completions" \\
145
145
  expect(snippet[1].content).toContain('"id": "mlx-community/Llama-3.2-3B-Instruct-mlx"');
146
146
  expect(snippet[2].content).toContain("pi");
147
147
  });
148
+ it("hermes-agent", async () => {
149
+ const { snippet: snippetFunc } = LOCAL_APPS["hermes-agent"];
150
+ const model = {
151
+ id: "bartowski/Llama-3.2-3B-Instruct-GGUF",
152
+ tags: ["conversational"],
153
+ gguf: { total: 1, context_length: 4096, chat_template: "{% if tools %}" },
154
+ inference: "",
155
+ };
156
+ const snippet = snippetFunc(model);
157
+ expect(snippet[0].content).toContain(`llama-server -hf bartowski/Llama-3.2-3B-Instruct-GGUF:{{QUANT_TAG}}`);
158
+ expect(snippet[1].content).toContain("hermes config set model.provider custom");
159
+ expect(snippet[1].content).toContain("hermes config set model.base_url http://127.0.0.1:8080/v1");
160
+ expect(snippet[1].content).toContain("hermes config set model.default bartowski/Llama-3.2-3B-Instruct-GGUF:{{QUANT_TAG}}");
161
+ expect(snippet[2].content).toContain("hermes");
162
+ });
163
+ it("hermes-agent - mlx", async () => {
164
+ const { snippet: snippetFunc } = LOCAL_APPS["hermes-agent"];
165
+ const model = {
166
+ id: "mlx-community/Llama-3.2-3B-Instruct-mlx",
167
+ tags: ["mlx", "conversational"],
168
+ pipeline_tag: "text-generation",
169
+ config: {
170
+ tokenizer_config: {
171
+ chat_template: "{% if tools %}...{% endif %}",
172
+ },
173
+ },
174
+ inference: "",
175
+ };
176
+ const snippet = snippetFunc(model);
177
+ expect(snippet[0].setup).toContain("uv tool install mlx-lm");
178
+ expect(snippet[1].content).toContain("hermes config set model.provider custom");
179
+ expect(snippet[1].content).toContain("hermes config set model.default mlx-community/Llama-3.2-3B-Instruct-mlx");
180
+ expect(snippet[2].content).toContain("hermes");
181
+ });
148
182
  it("docker model runner", async () => {
149
183
  const { snippet: snippetFunc } = LOCAL_APPS["docker-model-runner"];
150
184
  const model = {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@huggingface/tasks",
3
- "version": "0.20.23",
3
+ "version": "0.20.24",
4
4
  "description": "List of ML tasks for huggingface.co/tasks",
5
5
  "keywords": [
6
6
  "hub",
@@ -60,6 +60,16 @@ export const AMD_GPU_SKUS: Record<string, AmdGpuHardwareSpec> = {
60
60
  memory: [8, 16],
61
61
  gfxVersion: "gfx1200",
62
62
  },
63
+ "PRO W7900": {
64
+ tflops: 122.6,
65
+ memory: [48],
66
+ gfxVersion: "gfx1100",
67
+ },
68
+ "PRO W7800": {
69
+ tflops: 90.5,
70
+ memory: [32, 48],
71
+ gfxVersion: "gfx1100",
72
+ },
63
73
  "RX 7900 XTX": {
64
74
  tflops: 122.8,
65
75
  memory: [24],
@@ -134,7 +134,7 @@ curl -X POST "http://localhost:8000/v1/chat/completions" \\
134
134
 
135
135
  expect(snippet[0].content).toContain(`llama-server -hf bartowski/Llama-3.2-3B-Instruct-GGUF:{{QUANT_TAG}}`);
136
136
  expect(snippet[1].setup).toContain("npm install -g @mariozechner/pi-coding-agent");
137
- expect(snippet[1].content).toContain(`"id": "Llama-3.2-3B-Instruct-GGUF"`);
137
+ expect(snippet[1].content).toContain(`"id": "bartowski/Llama-3.2-3B-Instruct-GGUF:{{QUANT_TAG}}"`);
138
138
  expect(snippet[2].content).toContain("pi");
139
139
  });
140
140
 
@@ -161,6 +161,46 @@ curl -X POST "http://localhost:8000/v1/chat/completions" \\
161
161
  expect(snippet[2].content).toContain("pi");
162
162
  });
163
163
 
164
+ it("hermes-agent", async () => {
165
+ const { snippet: snippetFunc } = LOCAL_APPS["hermes-agent"];
166
+ const model: ModelData = {
167
+ id: "bartowski/Llama-3.2-3B-Instruct-GGUF",
168
+ tags: ["conversational"],
169
+ gguf: { total: 1, context_length: 4096, chat_template: "{% if tools %}" },
170
+ inference: "",
171
+ };
172
+ const snippet = snippetFunc(model);
173
+
174
+ expect(snippet[0].content).toContain(`llama-server -hf bartowski/Llama-3.2-3B-Instruct-GGUF:{{QUANT_TAG}}`);
175
+ expect(snippet[1].content).toContain("hermes config set model.provider custom");
176
+ expect(snippet[1].content).toContain("hermes config set model.base_url http://127.0.0.1:8080/v1");
177
+ expect(snippet[1].content).toContain(
178
+ "hermes config set model.default bartowski/Llama-3.2-3B-Instruct-GGUF:{{QUANT_TAG}}",
179
+ );
180
+ expect(snippet[2].content).toContain("hermes");
181
+ });
182
+
183
+ it("hermes-agent - mlx", async () => {
184
+ const { snippet: snippetFunc } = LOCAL_APPS["hermes-agent"];
185
+ const model: ModelData = {
186
+ id: "mlx-community/Llama-3.2-3B-Instruct-mlx",
187
+ tags: ["mlx", "conversational"],
188
+ pipeline_tag: "text-generation",
189
+ config: {
190
+ tokenizer_config: {
191
+ chat_template: "{% if tools %}...{% endif %}",
192
+ },
193
+ },
194
+ inference: "",
195
+ };
196
+ const snippet = snippetFunc(model);
197
+
198
+ expect(snippet[0].setup).toContain("uv tool install mlx-lm");
199
+ expect(snippet[1].content).toContain("hermes config set model.provider custom");
200
+ expect(snippet[1].content).toContain("hermes config set model.default mlx-community/Llama-3.2-3B-Instruct-mlx");
201
+ expect(snippet[2].content).toContain("hermes");
202
+ });
203
+
164
204
  it("docker model runner", async () => {
165
205
  const { snippet: snippetFunc } = LOCAL_APPS["docker-model-runner"];
166
206
  const model: ModelData = {
package/src/local-apps.ts CHANGED
@@ -139,6 +139,14 @@ function isUnslothModel(model: ModelData) {
139
139
  return model.tags.includes("unsloth") || isLlamaCppGgufModel(model);
140
140
  }
141
141
 
142
+ function isToolCallingLocalAgentModel(model: ModelData): boolean {
143
+ return (
144
+ (isLlamaCppGgufModel(model) || isMlxModel(model)) &&
145
+ model.tags.includes("conversational") &&
146
+ !!getChatTemplate(model)?.includes("tools")
147
+ );
148
+ }
149
+
142
150
  function getQuantTag(filepath?: string): string {
143
151
  const defaultTag = ":{{QUANT_TAG}}";
144
152
 
@@ -463,12 +471,8 @@ const snippetMlxLm = (model: ModelData): LocalAppSnippet[] => {
463
471
  ];
464
472
  };
465
473
 
466
- const snippetPi = (model: ModelData, filepath?: string): LocalAppSnippet[] => {
467
- const modelName = model.id.split("/").pop() ?? model.id;
468
- const isMLX = isMlxModel(model);
469
-
470
- // Step 1: Server — differs by backend
471
- const serverStep: LocalAppSnippet = isMLX
474
+ const getLocalServerStep = (model: ModelData, filepath?: string): LocalAppSnippet => {
475
+ return isMlxModel(model)
472
476
  ? {
473
477
  title: "Start the MLX server",
474
478
  setup: "# Install MLX LM:\nuv tool install mlx-lm",
@@ -479,8 +483,13 @@ const snippetPi = (model: ModelData, filepath?: string): LocalAppSnippet[] => {
479
483
  setup: "# Install llama.cpp:\nbrew install llama.cpp",
480
484
  content: `# Start a local OpenAI-compatible server:\nllama-server -hf ${model.id}${getQuantTag(filepath)}`,
481
485
  };
486
+ };
487
+
488
+ const snippetPi = (model: ModelData, filepath?: string): LocalAppSnippet[] => {
489
+ const isMLX = isMlxModel(model);
490
+ const modelId = isMLX ? model.id : `${model.id}${getQuantTag(filepath)}`;
491
+ const serverStep = getLocalServerStep(model, filepath);
482
492
 
483
- // Step 2: Pi config — port and provider name differ
484
493
  const modelsJson = JSON.stringify(
485
494
  {
486
495
  providers: {
@@ -488,7 +497,7 @@ const snippetPi = (model: ModelData, filepath?: string): LocalAppSnippet[] => {
488
497
  baseUrl: "http://localhost:8080/v1",
489
498
  api: "openai-completions",
490
499
  apiKey: "none",
491
- models: [{ id: isMLX ? model.id : modelName }],
500
+ models: [{ id: modelId }],
492
501
  },
493
502
  },
494
503
  },
@@ -510,6 +519,33 @@ const snippetPi = (model: ModelData, filepath?: string): LocalAppSnippet[] => {
510
519
  ];
511
520
  };
512
521
 
522
+ const snippetHermesAgent = (model: ModelData, filepath?: string): LocalAppSnippet[] => {
523
+ const modelId = isMlxModel(model) ? model.id : `${model.id}${getQuantTag(filepath)}`;
524
+ const serverStep = getLocalServerStep(model, filepath);
525
+
526
+ return [
527
+ serverStep,
528
+ {
529
+ title: "Configure Hermes",
530
+ setup: [
531
+ "# Install Hermes:",
532
+ "curl -fsSL https://hermes-agent.nousresearch.com/install.sh | bash",
533
+ "hermes setup",
534
+ ].join("\n"),
535
+ content: [
536
+ "# Point Hermes at the local server:",
537
+ "hermes config set model.provider custom",
538
+ "hermes config set model.base_url http://127.0.0.1:8080/v1",
539
+ `hermes config set model.default ${modelId}`,
540
+ ].join("\n"),
541
+ },
542
+ {
543
+ title: "Run Hermes",
544
+ content: "hermes",
545
+ },
546
+ ];
547
+ };
548
+
513
549
  const snippetDockerModelRunner = (model: ModelData, filepath?: string): string => {
514
550
  // Only add quant tag for GGUF models, not safetensors
515
551
  const quantTag = isLlamaCppGgufModel(model) ? getQuantTag(filepath) : "";
@@ -755,12 +791,16 @@ export const LOCAL_APPS = {
755
791
  prettyLabel: "Pi",
756
792
  docsUrl: "https://github.com/badlogic/pi-mono",
757
793
  mainTask: "text-generation",
758
- displayOnModelPage: (model) =>
759
- (isLlamaCppGgufModel(model) || isMlxModel(model)) &&
760
- model.tags.includes("conversational") &&
761
- !!getChatTemplate(model)?.includes("tools"),
794
+ displayOnModelPage: isToolCallingLocalAgentModel,
762
795
  snippet: snippetPi,
763
796
  },
797
+ "hermes-agent": {
798
+ prettyLabel: "Hermes Agent",
799
+ docsUrl: "https://hermes-agent.nousresearch.com/",
800
+ mainTask: "text-generation",
801
+ displayOnModelPage: isToolCallingLocalAgentModel,
802
+ snippet: snippetHermesAgent,
803
+ },
764
804
  } satisfies Record<string, LocalApp>;
765
805
 
766
806
  export type LocalAppKey = keyof typeof LOCAL_APPS;