From ca6e7be95b71219b25155b5a14ad9580795301f5 Mon Sep 17 00:00:00 2001 From: danielholanda Date: Wed, 27 Aug 2025 14:47:20 -0400 Subject: [PATCH 1/7] Enable ryzenai model integration --- packages/tasks/src/local-apps.ts | 34 ++++++++++++++++++++++++-------- 1 file changed, 26 insertions(+), 8 deletions(-) diff --git a/packages/tasks/src/local-apps.ts b/packages/tasks/src/local-apps.ts index f6632e0e60..9b96c1b27a 100644 --- a/packages/tasks/src/local-apps.ts +++ b/packages/tasks/src/local-apps.ts @@ -90,6 +90,10 @@ function isLlamaCppGgufModel(model: ModelData) { return !!model.gguf?.context_length; } +function isAmdRyzenModel(model: ModelData) { + return model.tags.includes("ryzenai-hybrid") || model.tags.includes("ryzenai-npu"); +} + function isMlxModel(model: ModelData) { return model.tags.includes("mlx"); } @@ -316,22 +320,36 @@ const snippetDockerModelRunner = (model: ModelData, filepath?: string): string = }; const snippetLemonade = (model: ModelData, filepath?: string): LocalAppSnippet[] => { - const tagName = getQuantTag(filepath); - const modelName = model.id.split("/")[1]; - return [ + const tagName = getQuantTag(filepath); + const modelName = model.id.includes("/") ? model.id.split("/")[1] : model.id; + + // Get recipe according to model type + const simplifiedModelName = modelName.split("-awq-g128-int4-asym-")[0]; + let recipe: string; + let checkpoint: string; + let requirements: string; + if (model.tags.some(tag => ["ryzenai-npu", "ryzenai-hybrid"].includes(tag))) { + recipe = model.tags.includes("ryzenai-npu") ? "oga-npu" : "oga-hybrid"; + checkpoint = model.id; + requirements = " (requires RyzenAI 300 series)"; + } else { + recipe = "llamacpp"; + checkpoint = `${model.id}${tagName}`; + requirements = ""; + } + + return [ { title: "Pull the model", setup: "# Download Lemonade from https://lemonade-server.ai/", content: [ - `lemonade-server pull user.${modelName} \\ - --checkpoint ${model.id}${tagName} \\ - --recipe llamacpp`, + `lemonade-server pull user.${simplifiedModelName} --checkpoint ${checkpoint} --recipe ${recipe}`, "# Note: If you installed from source, use the lemonade-server-dev command instead.", ].join("\n"), }, { - title: "Run and chat with the model", - content: `lemonade-server run user.${modelName}`, + title: `Run and chat with the model${requirements}`, + content: `lemonade-server run user.${simplifiedModelName}`, }, { title: "List all available models", From 3faae2bf3d76a44eb5b6f1353c8aa3397f4c7816 Mon Sep 17 00:00:00 2001 From: danielholanda Date: Wed, 27 Aug 2025 14:51:25 -0400 Subject: [PATCH 2/7] Cleaner --- packages/tasks/src/local-apps.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/tasks/src/local-apps.ts b/packages/tasks/src/local-apps.ts index 9b96c1b27a..b75edfeb02 100644 --- a/packages/tasks/src/local-apps.ts +++ b/packages/tasks/src/local-apps.ts @@ -324,7 +324,7 @@ const snippetLemonade = (model: ModelData, filepath?: string): LocalAppSnippet[] const modelName = model.id.includes("/") ? model.id.split("/")[1] : model.id; // Get recipe according to model type - const simplifiedModelName = modelName.split("-awq-g128-int4-asym-")[0]; + let simplifiedModelName: string; let recipe: string; let checkpoint: string; let requirements: string; @@ -332,10 +332,12 @@ const snippetLemonade = (model: ModelData, filepath?: string): LocalAppSnippet[] recipe = model.tags.includes("ryzenai-npu") ? "oga-npu" : "oga-hybrid"; checkpoint = model.id; requirements = " (requires RyzenAI 300 series)"; + simplifiedModelName = modelName.split("-awq-g128-int4-asym-")[0]; } else { recipe = "llamacpp"; checkpoint = `${model.id}${tagName}`; requirements = ""; + simplifiedModelName = modelName; } return [ From 8e2265364c45d666af28f13103e007c8e2e170da Mon Sep 17 00:00:00 2001 From: danielholanda Date: Thu, 28 Aug 2025 11:39:47 -0400 Subject: [PATCH 3/7] Suggested changes --- packages/tasks/src/local-apps.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/tasks/src/local-apps.ts b/packages/tasks/src/local-apps.ts index b75edfeb02..c53747b5d0 100644 --- a/packages/tasks/src/local-apps.ts +++ b/packages/tasks/src/local-apps.ts @@ -333,6 +333,7 @@ const snippetLemonade = (model: ModelData, filepath?: string): LocalAppSnippet[] checkpoint = model.id; requirements = " (requires RyzenAI 300 series)"; simplifiedModelName = modelName.split("-awq-g128-int4-asym-")[0]; + simplifiedModelName += recipe === "oga-npu" ? "-Npu" : "-Hybrid"; } else { recipe = "llamacpp"; checkpoint = `${model.id}${tagName}`; From 4e725d6479e36bcc65340392ca05963e0df31c33 Mon Sep 17 00:00:00 2001 From: danielholanda Date: Thu, 28 Aug 2025 11:42:09 -0400 Subject: [PATCH 4/7] Casing --- packages/tasks/src/local-apps.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/tasks/src/local-apps.ts b/packages/tasks/src/local-apps.ts index c53747b5d0..b11883df6f 100644 --- a/packages/tasks/src/local-apps.ts +++ b/packages/tasks/src/local-apps.ts @@ -333,7 +333,7 @@ const snippetLemonade = (model: ModelData, filepath?: string): LocalAppSnippet[] checkpoint = model.id; requirements = " (requires RyzenAI 300 series)"; simplifiedModelName = modelName.split("-awq-g128-int4-asym-")[0]; - simplifiedModelName += recipe === "oga-npu" ? "-Npu" : "-Hybrid"; + simplifiedModelName += recipe === "oga-npu" ? "-NPU" : "-Hybrid"; } else { recipe = "llamacpp"; checkpoint = `${model.id}${tagName}`; From f912150db85c00c0e2927f923927bedbe7c934b1 Mon Sep 17 00:00:00 2001 From: danielholanda Date: Tue, 2 Sep 2025 17:03:48 -0400 Subject: [PATCH 5/7] Suggested changes --- packages/tasks/src/local-apps.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/tasks/src/local-apps.ts b/packages/tasks/src/local-apps.ts index b11883df6f..e3fe7a7174 100644 --- a/packages/tasks/src/local-apps.ts +++ b/packages/tasks/src/local-apps.ts @@ -332,7 +332,7 @@ const snippetLemonade = (model: ModelData, filepath?: string): LocalAppSnippet[] recipe = model.tags.includes("ryzenai-npu") ? "oga-npu" : "oga-hybrid"; checkpoint = model.id; requirements = " (requires RyzenAI 300 series)"; - simplifiedModelName = modelName.split("-awq-g128-int4-asym-")[0]; + simplifiedModelName = modelName.split("-awq-")[0]; simplifiedModelName += recipe === "oga-npu" ? "-NPU" : "-Hybrid"; } else { recipe = "llamacpp"; From 7fd3a6522c76c074aee359b2e63bed3971039853 Mon Sep 17 00:00:00 2001 From: danielholanda Date: Thu, 4 Sep 2025 12:49:45 -0400 Subject: [PATCH 6/7] Connect Lemonade to isAmdRyzenModel function --- packages/tasks/src/local-apps.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/tasks/src/local-apps.ts b/packages/tasks/src/local-apps.ts index e3fe7a7174..6370b93f9c 100644 --- a/packages/tasks/src/local-apps.ts +++ b/packages/tasks/src/local-apps.ts @@ -542,7 +542,7 @@ export const LOCAL_APPS = { prettyLabel: "Lemonade", docsUrl: "https://lemonade-server.ai", mainTask: "text-generation", - displayOnModelPage: isLlamaCppGgufModel, + displayOnModelPage: (model) => isLlamaCppGgufModel(model) || isAmdRyzenModel(model), snippet: snippetLemonade, }, } satisfies Record; From f470d81ff3191c862965aa2679e206d31d75b85a Mon Sep 17 00:00:00 2001 From: Bertrand Chevrier Date: Wed, 10 Sep 2025 09:24:49 +0200 Subject: [PATCH 7/7] lint --- packages/tasks/src/local-apps.ts | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/packages/tasks/src/local-apps.ts b/packages/tasks/src/local-apps.ts index 6370b93f9c..7f9aeb6c43 100644 --- a/packages/tasks/src/local-apps.ts +++ b/packages/tasks/src/local-apps.ts @@ -320,28 +320,28 @@ const snippetDockerModelRunner = (model: ModelData, filepath?: string): string = }; const snippetLemonade = (model: ModelData, filepath?: string): LocalAppSnippet[] => { - const tagName = getQuantTag(filepath); - const modelName = model.id.includes("/") ? model.id.split("/")[1] : model.id; + const tagName = getQuantTag(filepath); + const modelName = model.id.includes("/") ? model.id.split("/")[1] : model.id; - // Get recipe according to model type + // Get recipe according to model type let simplifiedModelName: string; - let recipe: string; - let checkpoint: string; - let requirements: string; - if (model.tags.some(tag => ["ryzenai-npu", "ryzenai-hybrid"].includes(tag))) { - recipe = model.tags.includes("ryzenai-npu") ? "oga-npu" : "oga-hybrid"; - checkpoint = model.id; - requirements = " (requires RyzenAI 300 series)"; + let recipe: string; + let checkpoint: string; + let requirements: string; + if (model.tags.some((tag) => ["ryzenai-npu", "ryzenai-hybrid"].includes(tag))) { + recipe = model.tags.includes("ryzenai-npu") ? "oga-npu" : "oga-hybrid"; + checkpoint = model.id; + requirements = " (requires RyzenAI 300 series)"; simplifiedModelName = modelName.split("-awq-")[0]; simplifiedModelName += recipe === "oga-npu" ? "-NPU" : "-Hybrid"; - } else { - recipe = "llamacpp"; - checkpoint = `${model.id}${tagName}`; - requirements = ""; + } else { + recipe = "llamacpp"; + checkpoint = `${model.id}${tagName}`; + requirements = ""; simplifiedModelName = modelName; - } + } - return [ + return [ { title: "Pull the model", setup: "# Download Lemonade from https://lemonade-server.ai/",