From 7f1b7d781d922a21766d050b24e593b661e18a44 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Wed, 25 Mar 2026 18:55:41 +0100 Subject: [PATCH 01/10] adding modules for downloading and running gguf modules --- .../huggingface/download/environment.yml | 6 + modules/nf-core/huggingface/download/main.nf | 30 ++++ modules/nf-core/huggingface/download/meta.yml | 60 ++++++++ .../huggingface/download/tests/main.nf.test | 64 ++++++++ .../download/tests/main.nf.test.snap | 34 +++++ .../nf-core/llamacpp-python/run/Dockerfile | 5 + .../llamacpp-python/run/environment.yml | 7 + modules/nf-core/llamacpp-python/run/main.nf | 36 +++++ modules/nf-core/llamacpp-python/run/meta.yml | 50 +++++++ .../run/resources/usr/bin/llamacpp-python.py | 137 ++++++++++++++++++ .../run/tests/data/prompt.json | 11 ++ .../run/tests/data/stub_model.gguf | 0 .../llamacpp-python/run/tests/main.nf.test | 79 ++++++++++ .../run/tests/main.nf.test.snap | 34 +++++ .../llamacpp-python/run/tests/nextflow.config | 7 + 15 files changed, 560 insertions(+) create mode 100644 modules/nf-core/huggingface/download/environment.yml create mode 100644 modules/nf-core/huggingface/download/main.nf create mode 100644 modules/nf-core/huggingface/download/meta.yml create mode 100644 modules/nf-core/huggingface/download/tests/main.nf.test create mode 100644 modules/nf-core/huggingface/download/tests/main.nf.test.snap create mode 100644 modules/nf-core/llamacpp-python/run/Dockerfile create mode 100644 modules/nf-core/llamacpp-python/run/environment.yml create mode 100644 modules/nf-core/llamacpp-python/run/main.nf create mode 100644 modules/nf-core/llamacpp-python/run/meta.yml create mode 100755 modules/nf-core/llamacpp-python/run/resources/usr/bin/llamacpp-python.py create mode 100644 modules/nf-core/llamacpp-python/run/tests/data/prompt.json create mode 100644 modules/nf-core/llamacpp-python/run/tests/data/stub_model.gguf create mode 100644 modules/nf-core/llamacpp-python/run/tests/main.nf.test create mode 100644 modules/nf-core/llamacpp-python/run/tests/main.nf.test.snap create mode 100644 modules/nf-core/llamacpp-python/run/tests/nextflow.config diff --git a/modules/nf-core/huggingface/download/environment.yml b/modules/nf-core/huggingface/download/environment.yml new file mode 100644 index 000000000000..f2267b412f67 --- /dev/null +++ b/modules/nf-core/huggingface/download/environment.yml @@ -0,0 +1,6 @@ +--- +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/environment-schema.json +channels: + - conda-forge +dependencies: + - conda-forge::huggingface_hub=1.6.0 diff --git a/modules/nf-core/huggingface/download/main.nf b/modules/nf-core/huggingface/download/main.nf new file mode 100644 index 000000000000..50e389afb415 --- /dev/null +++ b/modules/nf-core/huggingface/download/main.nf @@ -0,0 +1,30 @@ +process HF_DOWNLOAD { + tag "$meta.id" + label 'process_medium' + + conda "${moduleDir}/environment.yml" + container "community.wave.seqera.io/library/huggingface_hub:1.6.0--c106a7f9664ca39b" + + input: + tuple val(meta), val(hf_repo), val(hf_file) + + output: + tuple val(meta), path(hf_file), emit: output + tuple val("${task.process}"), val("huggingface_hub"), eval("hf --version 2>&1"), topic: versions, emit: versions_huggingface_hub + + when: + task.ext.when == null || task.ext.when + + script: + """ + export HF_HOME="${workflow.projectDir}/hf_cache" + export HF_HUB_CACHE="${workflow.projectDir}/hf_cache" + STARTDIR=\$PWD + hf download ${hf_repo} ${hf_file} --local-dir \$STARTDIR + """ + + stub: + """ + touch ${hf_file} + """ +} diff --git a/modules/nf-core/huggingface/download/meta.yml b/modules/nf-core/huggingface/download/meta.yml new file mode 100644 index 000000000000..c9a5abe83fe4 --- /dev/null +++ b/modules/nf-core/huggingface/download/meta.yml @@ -0,0 +1,60 @@ +name: huggignface_hub +description: Tool for downloading models from HuggingFace +keywords: + - llm + - llama + - ai +tools: + - huggignface_hub: + description: "HuggingFace Hub CLI interface" + homepage: "https://huggingface.co/docs/huggingface_hub/guides/cli" + licence: ["MIT"] +input: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'sample1' ]`- prompt_file: + - hf_repo: + type: string + description: HuggingFace repository + - hf_file: + type: string + description: HuggingFace GGUF file +output: + output: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'sample1' ]` + - output: + type: file + description: Model in GGUF format + pattern: "*.gguf" + versions_huggingface_hub: + - versions.yml: + type: file + description: File containing software versions + pattern: "versions.yml" + ontologies: + - edam: http://edamontology.org/format_3750 # YAML + +topics: + versions: + - - ${task.process}: + type: string + description: The name of the process + - huggingface_hub: + type: string + description: The name of the tool + - hf --version: + type: eval + description: The expression to obtain the version of the tool + +authors: + - "@toniher" + - "@lucacozzuto" +maintainers: + - "@toniher" + - "@lucacozzuto" diff --git a/modules/nf-core/huggingface/download/tests/main.nf.test b/modules/nf-core/huggingface/download/tests/main.nf.test new file mode 100644 index 000000000000..b15446029a9c --- /dev/null +++ b/modules/nf-core/huggingface/download/tests/main.nf.test @@ -0,0 +1,64 @@ +nextflow_process { + + name "Test Process HF_DOWNLOAD" + script "../main.nf" + process "HF_DOWNLOAD" + + tag "modules" + tag "modules_local" + tag "huggingface" + tag "huggingface/download" + + test("download gguf file") { + + when { + process { + """ + input[0] = [ + [ id:'test_model' ], + "ggml-org/gemma-3-1b-it-GGUF", + "gemma-3-1b-it-Q4_K_M.gguf" + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert process.out.output.size() == 1 }, + { assert process.out.output[0][0] == [ id:'test_model' ] }, + { assert file(process.out.output[0][1]).name == "gemma-3-1b-it-Q4_K_M.gguf" }, + { assert file(process.out.output[0][1]).size() > 0 }, + { assert snapshot(process.out.versions_huggingface_hub).match() } + ) + } + } + + test("stub - download gguf file") { + + options "-stub" + + when { + process { + """ + input[0] = [ + [ id:'test_model' ], + "ggml-org/gemma-3-1b-it-GGUF", + "gemma-3-1b-it-Q4_K_M.gguf" + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert process.out.output.size() == 1 }, + { assert process.out.output[0][0] == [ id:'test_model' ] }, + { assert file(process.out.output[0][1]).name == "gemma-3-1b-it-Q4_K_M.gguf" }, + { assert snapshot(process.out.versions_huggingface_hub).match() } + ) + } + } +} diff --git a/modules/nf-core/huggingface/download/tests/main.nf.test.snap b/modules/nf-core/huggingface/download/tests/main.nf.test.snap new file mode 100644 index 000000000000..fb0ec0f4e827 --- /dev/null +++ b/modules/nf-core/huggingface/download/tests/main.nf.test.snap @@ -0,0 +1,34 @@ +{ + "stub - download gguf file": { + "content": [ + [ + [ + "HF_DOWNLOAD", + "huggingface_hub", + "1.6.0" + ] + ] + ], + "timestamp": "2026-03-25T17:55:42.821958238", + "meta": { + "nf-test": "0.9.5", + "nextflow": "25.10.4" + } + }, + "download gguf file": { + "content": [ + [ + [ + "HF_DOWNLOAD", + "huggingface_hub", + "1.6.0" + ] + ] + ], + "timestamp": "2026-03-25T17:55:36.08739868", + "meta": { + "nf-test": "0.9.5", + "nextflow": "25.10.4" + } + } +} \ No newline at end of file diff --git a/modules/nf-core/llamacpp-python/run/Dockerfile b/modules/nf-core/llamacpp-python/run/Dockerfile new file mode 100644 index 000000000000..aeb89834ee1c --- /dev/null +++ b/modules/nf-core/llamacpp-python/run/Dockerfile @@ -0,0 +1,5 @@ +FROM nvidia/cuda:12.4.1-devel-ubuntu22.04 + +RUN apt-get update && apt-get install -y python3 python3-pip +RUN pip3 install llama-cpp-python \ + --extra-index-url https://abetlen.github.io/llama-cpp-python/whl/cu124 diff --git a/modules/nf-core/llamacpp-python/run/environment.yml b/modules/nf-core/llamacpp-python/run/environment.yml new file mode 100644 index 000000000000..9f314201924a --- /dev/null +++ b/modules/nf-core/llamacpp-python/run/environment.yml @@ -0,0 +1,7 @@ +--- +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/environment-schema.json +channels: + - conda-forge + - bioconda +dependencies: + - conda-forge::llama-cpp-python=0.3.16 diff --git a/modules/nf-core/llamacpp-python/run/main.nf b/modules/nf-core/llamacpp-python/run/main.nf new file mode 100644 index 000000000000..5dec0f6bcf28 --- /dev/null +++ b/modules/nf-core/llamacpp-python/run/main.nf @@ -0,0 +1,36 @@ +process LLAMACPP_PYTHON_RUN { + tag "$meta.id" + label 'process_medium' + label 'process_gpu' + + conda "${moduleDir}/environment.yml" + container "${ task.ext.use_gpu ? 'quay.io/nf-core/llama-cpp-python:0.1.9' : 'community.wave.seqera.io/library/llama-cpp-python:0.3.16--b351398cd0ea7fc5' }" + + input: + tuple val(meta), path(prompt_file), path(gguf_model) + + output: + tuple val(meta), path("output.txt"), emit: output + tuple val("${task.process}"), val("llama-cpp-python"), eval("python3 -c 'import llama_cpp; print(llama_cpp.__version__)'"), topic: versions, emit: versions_llama_cpp_python + + when: + task.ext.when == null || task.ext.when + + script: + def args = task.ext.args ?: '' + prefix = task.ext.prefix ?: "${meta.id}" + """ + llamacpp-python.py \ + --model ${gguf_model} \ + --messages ${prompt_file} \ + --output output.txt \ + ${args} + """ + + stub: + prefix = task.ext.prefix ?: "${meta.id}" + """ + touch output.txt + + """ +} diff --git a/modules/nf-core/llamacpp-python/run/meta.yml b/modules/nf-core/llamacpp-python/run/meta.yml new file mode 100644 index 000000000000..15f4b893829b --- /dev/null +++ b/modules/nf-core/llamacpp-python/run/meta.yml @@ -0,0 +1,50 @@ +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/subworkflows/yaml-schema.json +name: llamacpp-python +description: Python wrapper for running locally-hosted LLM with llama.cpp +keywords: + - llm + - llama + - ai +input: + - prompt_file: + type: file + description: | + Prompt file + Structure: [ val(meta), path(prompt_file) ] + - gguf_model: + type: file + description: | + GGUF model + Structure: [ val(meta), path(gguf_model) ] +output: + - output: + type: file + description: | + Output of the LLM query + Structure: [ val(meta), path("output.txt") ] + pattern: "output.txt" + - versions_llama_cpp_python: + type: file + description: | + File containing software versions + Structure: path(versions.yml) + pattern: "versions.yml" + +topics: + versions: + - - ${task.process}: + type: string + description: The name of the process + - llama-cpp-python: + type: string + description: The name of the tool + - python3 -c 'import llama_cpp; print(llama_cpp.__version__)': + type: eval + description: The expression to obtain the version of the tool +authors: + - "@toniher" + - "@lucacozzuto" +maintainers: + - "@toniher" + - "@lucacozzuto" + diff --git a/modules/nf-core/llamacpp-python/run/resources/usr/bin/llamacpp-python.py b/modules/nf-core/llamacpp-python/run/resources/usr/bin/llamacpp-python.py new file mode 100755 index 000000000000..e9e6123544f3 --- /dev/null +++ b/modules/nf-core/llamacpp-python/run/resources/usr/bin/llamacpp-python.py @@ -0,0 +1,137 @@ +#!/usr/bin/env python3 + +import argparse +import json +import os +import sys + +import llama_cpp + + +# Helper to create messages from a text file +def create_messages_from_textfile(textfile, system_prompt): + try: + with open(textfile, "r", encoding="utf-8") as f: + content = f.read() + return [ + {"role": "system", "content": system_prompt.strip()}, + {"role": "user", "content": content.strip()}, + ] + except Exception as e: + print(f"Error reading text file '{textfile}': {e}", file=sys.stderr) + sys.exit(1) + + +# Helper to load messages from JSON or fallback to text +def load_messages(messages_file, system_prompt): + if not os.path.exists(messages_file): + print(f"Messages file '{messages_file}' does not exist.", file=sys.stderr) + sys.exit(1) + try: + with open(messages_file, "r", encoding="utf-8") as f: + content = f.read() + try: + return json.loads(content) + except json.JSONDecodeError: + return create_messages_from_textfile(messages_file, system_prompt) + except Exception as e: + print(f"Error opening messages file '{messages_file}': {e}", file=sys.stderr) + sys.exit(1) + + +def llamacpp_python( + messages_file, + model_file, + temperature=0.9, + output="output.txt", + verbose=False, + context_size=2048, + chat_format="chatml", + seed=None, +): + if not os.path.exists(model_file): + print(f"Model file '{model_file}' does not exist.", file=sys.stderr) + sys.exit(1) + + # Default system prompt + system_prompt = "A chat between a curious user and an artificial intelligence assistant. The assistant gives helpful, detailed, and polite answers to the user's questions" + + messages_json = load_messages(messages_file, system_prompt) + + try: + llm = llama_cpp.Llama( + model_path=model_file, + chat_format=chat_format, + n_ctx=context_size, + seed=seed, + ) + response = llm.create_chat_completion( + messages=messages_json, + response_format={"type": "json_object"}, + temperature=temperature, + ) + except Exception as e: + print(f"Error running llama_cpp: {e}", file=sys.stderr) + sys.exit(1) + + if not verbose: + try: + reply = response["choices"][0]["message"]["content"] + except (KeyError, IndexError, TypeError): + reply = response + # Try to parse reply as JSON if it's a string + if isinstance(reply, str): + try: + reply_json = json.loads(reply) + if isinstance(reply_json, dict) and len(reply_json) == 1: + reply = next(iter(reply_json.values())) + else: + reply = reply_json + except Exception: + pass # Leave reply as string if not valid JSON + elif isinstance(reply, dict) and len(reply) == 1: + reply = next(iter(reply.values())) + else: + reply = response + + try: + with open(output, "w", encoding="utf-8") as f: + if isinstance(reply, str): + f.write(reply) + else: + f.write(json.dumps(reply, indent=2)) + if verbose: + print(f"Output written to {output}") + except Exception as e: + print(f"Error writing output file '{output}': {e}", file=sys.stderr) + sys.exit(1) + + +def main(): + parser = argparse.ArgumentParser(description="Submit a process with model.") + parser.add_argument("-s", "--messages", required=True, help="JSON message") + parser.add_argument("-m", "--model", required=True, help="Model used") + parser.add_argument( + "-t", "--temperature", default=0.9, type=float, help="Temperature" + ) + parser.add_argument("-o", "--output", default="output.txt", help="Output text") + parser.add_argument("-c", "--context", default=2048, type=int, help="Context size") + parser.add_argument("--chat_format", default="chatml", help="Chat format") + parser.add_argument("--seed", default=None, type=int, help="Defined seed") + parser.add_argument("--verbose", action="store_true", help="Verbose output") + + args = parser.parse_args() + llamacpp_python( + messages_file=args.messages, + model_file=args.model, + temperature=args.temperature, + output=args.output, + verbose=args.verbose, + context_size=args.context, + chat_format=args.chat_format, + seed=args.seed, + ) + + +if __name__ == "__main__": + main() diff --git a/modules/nf-core/llamacpp-python/run/tests/data/prompt.json b/modules/nf-core/llamacpp-python/run/tests/data/prompt.json new file mode 100644 index 000000000000..7d76ad158bab --- /dev/null +++ b/modules/nf-core/llamacpp-python/run/tests/data/prompt.json @@ -0,0 +1,11 @@ +[ + { + "role": "system", + "content": "A chat between a curious user and an artificial intelligence assistant. The assistant gives helpful, detailed, and polite answers to the user's questions" + + }, + { + "role": "user", + "content": "Describe Barcelona in one paragraph" + } +] diff --git a/modules/nf-core/llamacpp-python/run/tests/data/stub_model.gguf b/modules/nf-core/llamacpp-python/run/tests/data/stub_model.gguf new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/modules/nf-core/llamacpp-python/run/tests/main.nf.test b/modules/nf-core/llamacpp-python/run/tests/main.nf.test new file mode 100644 index 000000000000..a3483d6dc9dc --- /dev/null +++ b/modules/nf-core/llamacpp-python/run/tests/main.nf.test @@ -0,0 +1,79 @@ +nextflow_process { + + name "Test Process LLAMACPP_PYTHON_RUN" + script "../main.nf" + process "LLAMACPP_PYTHON_RUN" + + tag "modules" + tag "modules_local" + tag "llamacpp_python" + tag "llamacpp_python/run" + + test("run inference with downloaded gguf model") { + + config "./nextflow.config" + + setup { + run("HF_DOWNLOAD") { + script "../../../huggingface/download/main.nf" + process { + """ + input[0] = [ + [ id:'test_model' ], + "ggml-org/gemma-3-1b-it-GGUF", + "gemma-3-1b-it-Q4_K_M.gguf" + ] + """ + } + } + } + + when { + process { + """ + input[0] = HF_DOWNLOAD.out.output.map { meta, model -> + [ [ id:'test_run' ], file("${moduleDir}/tests/data/prompt.json"), model ] + } + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert process.out.output.size() == 1 }, + { assert process.out.output[0][0] == [ id:'test_run' ] }, + { assert file(process.out.output[0][1]).name == "output.txt" }, + { assert file(process.out.output[0][1]).size() > 0 }, + { assert snapshot(process.out.versions_llama_cpp_python).match() } + ) + } + } + + test("stub - run inference with json prompt") { + + options "-stub" + + when { + process { + """ + input[0] = [ + [ id:'test_run' ], + file("${moduleDir}/tests/data/prompt.json"), + file("${moduleDir}/tests/data/stub_model.gguf") + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert process.out.output.size() == 1 }, + { assert process.out.output[0][0] == [ id:'test_run' ] }, + { assert file(process.out.output[0][1]).name == "output.txt" }, + { assert snapshot(process.out.versions_llama_cpp_python).match() } + ) + } + } +} diff --git a/modules/nf-core/llamacpp-python/run/tests/main.nf.test.snap b/modules/nf-core/llamacpp-python/run/tests/main.nf.test.snap new file mode 100644 index 000000000000..5f5b167f758b --- /dev/null +++ b/modules/nf-core/llamacpp-python/run/tests/main.nf.test.snap @@ -0,0 +1,34 @@ +{ + "run inference with downloaded gguf model": { + "content": [ + [ + [ + "LLAMACPP_PYTHON_RUN", + "llama-cpp-python", + "0.3.16" + ] + ] + ], + "timestamp": "2026-03-25T18:33:08.596485421", + "meta": { + "nf-test": "0.9.5", + "nextflow": "25.10.4" + } + }, + "stub - run inference with json prompt": { + "content": [ + [ + [ + "LLAMACPP_PYTHON_RUN", + "llama-cpp-python", + "0.3.16" + ] + ] + ], + "timestamp": "2026-03-25T17:23:21.997786726", + "meta": { + "nf-test": "0.9.5", + "nextflow": "25.10.4" + } + } +} \ No newline at end of file diff --git a/modules/nf-core/llamacpp-python/run/tests/nextflow.config b/modules/nf-core/llamacpp-python/run/tests/nextflow.config new file mode 100644 index 000000000000..7a6b3c247728 --- /dev/null +++ b/modules/nf-core/llamacpp-python/run/tests/nextflow.config @@ -0,0 +1,7 @@ +nextflow.enable.moduleBinaries = true + +process { + withName: 'LLAMACPP_PYTHON_RUN' { + ext.args = "--seed 42" + } +} From 9031f483a189cd2ce880a9eb0fe8b178cd2c99e6 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Wed, 25 Mar 2026 19:33:59 +0100 Subject: [PATCH 02/10] adding docker support --- modules/nf-core/huggingface/download/tests/nextflow.config | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 modules/nf-core/huggingface/download/tests/nextflow.config diff --git a/modules/nf-core/huggingface/download/tests/nextflow.config b/modules/nf-core/huggingface/download/tests/nextflow.config new file mode 100644 index 000000000000..68a5630f57cb --- /dev/null +++ b/modules/nf-core/huggingface/download/tests/nextflow.config @@ -0,0 +1,7 @@ +nextflow.enable.moduleBinaries = true + +process { + withName: 'HF_DOWNLOAD' { + containerOptions = { workflow.profile.contains('docker') ? "--volume ${projectDir}/hf_cache:${projectDir}/hf_cache" : '' } + } +} From 04cd556c9a722501fc3c68403240433008e25c4e Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Thu, 26 Mar 2026 08:46:54 +0100 Subject: [PATCH 03/10] allow custom HF_HOME cache input and other fixes --- modules/nf-core/huggingface/download/main.nf | 12 ++++++------ modules/nf-core/huggingface/download/meta.yml | 2 +- .../nf-core/huggingface/download/tests/main.nf.test | 6 ++++-- .../huggingface/download/tests/main.nf.test.snap | 4 ++-- 4 files changed, 13 insertions(+), 11 deletions(-) diff --git a/modules/nf-core/huggingface/download/main.nf b/modules/nf-core/huggingface/download/main.nf index 50e389afb415..63eef3a5bcb2 100644 --- a/modules/nf-core/huggingface/download/main.nf +++ b/modules/nf-core/huggingface/download/main.nf @@ -6,21 +6,21 @@ process HF_DOWNLOAD { container "community.wave.seqera.io/library/huggingface_hub:1.6.0--c106a7f9664ca39b" input: - tuple val(meta), val(hf_repo), val(hf_file) + tuple val(meta), val(hf_repo), val(hf_file), val(hf_home) output: tuple val(meta), path(hf_file), emit: output - tuple val("${task.process}"), val("huggingface_hub"), eval("hf --version 2>&1"), topic: versions, emit: versions_huggingface_hub + tuple val("${task.process}"), val("huggingface_hub"), eval("hf --version 2>&1 | awk '{print \$NF}'"), topic: versions, emit: versions_huggingface_hub when: task.ext.when == null || task.ext.when script: + def hf_home_resolved = hf_home ?: "${workflow.projectDir}/hf_cache" """ - export HF_HOME="${workflow.projectDir}/hf_cache" - export HF_HUB_CACHE="${workflow.projectDir}/hf_cache" - STARTDIR=\$PWD - hf download ${hf_repo} ${hf_file} --local-dir \$STARTDIR + export HF_HOME="${hf_home_resolved}" + export HF_HUB_CACHE=\$HF_HOME + hf download ${hf_repo} ${hf_file} --local-dir \$PWD """ stub: diff --git a/modules/nf-core/huggingface/download/meta.yml b/modules/nf-core/huggingface/download/meta.yml index c9a5abe83fe4..8c8332a879e5 100644 --- a/modules/nf-core/huggingface/download/meta.yml +++ b/modules/nf-core/huggingface/download/meta.yml @@ -50,7 +50,7 @@ topics: description: The name of the tool - hf --version: type: eval - description: The expression to obtain the version of the tool + description: The expression to obtain only the version number of the tool (e.g. "1.6.0") authors: - "@toniher" diff --git a/modules/nf-core/huggingface/download/tests/main.nf.test b/modules/nf-core/huggingface/download/tests/main.nf.test index b15446029a9c..94d0112862c4 100644 --- a/modules/nf-core/huggingface/download/tests/main.nf.test +++ b/modules/nf-core/huggingface/download/tests/main.nf.test @@ -17,7 +17,8 @@ nextflow_process { input[0] = [ [ id:'test_model' ], "ggml-org/gemma-3-1b-it-GGUF", - "gemma-3-1b-it-Q4_K_M.gguf" + "gemma-3-1b-it-Q4_K_M.gguf", + "./hf_cache" ] """ } @@ -45,7 +46,8 @@ nextflow_process { input[0] = [ [ id:'test_model' ], "ggml-org/gemma-3-1b-it-GGUF", - "gemma-3-1b-it-Q4_K_M.gguf" + "gemma-3-1b-it-Q4_K_M.gguf", + "./hf_cache" ] """ } diff --git a/modules/nf-core/huggingface/download/tests/main.nf.test.snap b/modules/nf-core/huggingface/download/tests/main.nf.test.snap index fb0ec0f4e827..406face5c7a6 100644 --- a/modules/nf-core/huggingface/download/tests/main.nf.test.snap +++ b/modules/nf-core/huggingface/download/tests/main.nf.test.snap @@ -9,7 +9,7 @@ ] ] ], - "timestamp": "2026-03-25T17:55:42.821958238", + "timestamp": "2026-03-26T08:39:57.919278809", "meta": { "nf-test": "0.9.5", "nextflow": "25.10.4" @@ -25,7 +25,7 @@ ] ] ], - "timestamp": "2026-03-25T17:55:36.08739868", + "timestamp": "2026-03-26T08:38:24.630341776", "meta": { "nf-test": "0.9.5", "nextflow": "25.10.4" From 537a891ef8b6dbd7ef7962131e0305a39a2acd3d Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Thu, 26 Mar 2026 10:12:38 +0100 Subject: [PATCH 04/10] several test fixes --- modules/nf-core/huggingface/download/meta.yml | 98 ++++++++++--------- modules/nf-core/llamacpp-python/run/meta.yml | 83 ++++++++++------ 2 files changed, 103 insertions(+), 78 deletions(-) diff --git a/modules/nf-core/huggingface/download/meta.yml b/modules/nf-core/huggingface/download/meta.yml index 8c8332a879e5..f540eb08b6c3 100644 --- a/modules/nf-core/huggingface/download/meta.yml +++ b/modules/nf-core/huggingface/download/meta.yml @@ -1,60 +1,66 @@ -name: huggignface_hub +name: hf_download description: Tool for downloading models from HuggingFace keywords: - - llm - - llama - - ai +- llm +- llama +- ai tools: - - huggignface_hub: - description: "HuggingFace Hub CLI interface" - homepage: "https://huggingface.co/docs/huggingface_hub/guides/cli" - licence: ["MIT"] +- huggingface_hub: + description: "HuggingFace Hub CLI interface" + homepage: "https://huggingface.co/docs/huggingface_hub/guides/cli" + licence: + - "MIT" + identifier: '' input: +- - meta: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'sample1' ]`- prompt_file: + - hf_repo: + type: string + description: HuggingFace repository + - hf_file: + type: string + description: HuggingFace GGUF file + - hf_home: + type: string + description: HuggingFace default cache directory +output: + output: - - meta: type: map description: | Groovy Map containing sample information - e.g. `[ id:'sample1' ]`- prompt_file: - - hf_repo: - type: string - description: HuggingFace repository + e.g. `[ id:'sample1' ]` - hf_file: - type: string - description: HuggingFace GGUF file -output: - output: - - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. `[ id:'sample1' ]` - - output: - type: file - description: Model in GGUF format - pattern: "*.gguf" - versions_huggingface_hub: - - versions.yml: type: file - description: File containing software versions - pattern: "versions.yml" - ontologies: - - edam: http://edamontology.org/format_3750 # YAML - + description: Downloaded HuggingFace GGUF file + ontologies: [] + versions_huggingface_hub: + - - ${task.process}: + type: string + description: The name of the process + - huggingface_hub: + type: string + description: The name of the tool + - hf --version 2>&1 | awk '{print \$NF}': + type: eval + description: The expression to obtain the version of the tool topics: versions: - - - ${task.process}: - type: string - description: The name of the process - - huggingface_hub: - type: string - description: The name of the tool - - hf --version: - type: eval - description: The expression to obtain only the version number of the tool (e.g. "1.6.0") - + - - ${task.process}: + type: string + description: The name of the process + - huggingface_hub: + type: string + description: The name of the tool + - hf --version 2>&1 | awk '{print \$NF}': + type: eval + description: The expression to obtain the version of the tool authors: - - "@toniher" - - "@lucacozzuto" +- "@toniher" +- "@lucacozzuto" maintainers: - - "@toniher" - - "@lucacozzuto" +- "@toniher" +- "@lucacozzuto" diff --git a/modules/nf-core/llamacpp-python/run/meta.yml b/modules/nf-core/llamacpp-python/run/meta.yml index 15f4b893829b..18607a776271 100644 --- a/modules/nf-core/llamacpp-python/run/meta.yml +++ b/modules/nf-core/llamacpp-python/run/meta.yml @@ -1,50 +1,69 @@ -# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/subworkflows/yaml-schema.json -name: llamacpp-python +name: llamacpp_python_run description: Python wrapper for running locally-hosted LLM with llama.cpp keywords: - - llm - - llama - - ai +- llm +- llama +- ai +tools: +- llama-cpp-python: + description: "Python wrapper for llama.cpp LLM inference tool" + homepage: "https://llama-cpp-python.readthedocs.io/en/latest/" + licence: + - "MIT" + identifier: '' input: +- - meta: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'sample1' ]`- prompt_file: - prompt_file: type: file description: | Prompt file Structure: [ val(meta), path(prompt_file) ] + ontologies: [] - gguf_model: type: file description: | GGUF model Structure: [ val(meta), path(gguf_model) ] + ontologies: [] output: - - output: - type: file - description: | - Output of the LLM query - Structure: [ val(meta), path("output.txt") ] - pattern: "output.txt" - - versions_llama_cpp_python: - type: file - description: | - File containing software versions - Structure: path(versions.yml) - pattern: "versions.yml" - + output: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'sample1' ]` + - "output.txt": + type: file + description: File with the output of LLM inference request + ontologies: [] + versions_llama_cpp_python: + - - ${task.process}: + type: string + description: The name of the process + - llama-cpp-python: + type: string + description: The name of the tool + - python3 -c 'import llama_cpp; print(llama_cpp.__version__)': + type: eval + description: The expression to obtain the version of the tool topics: versions: - - - ${task.process}: - type: string - description: The name of the process - - llama-cpp-python: - type: string - description: The name of the tool - - python3 -c 'import llama_cpp; print(llama_cpp.__version__)': - type: eval - description: The expression to obtain the version of the tool + - - ${task.process}: + type: string + description: The name of the process + - llama-cpp-python: + type: string + description: The name of the tool + - python3 -c 'import llama_cpp; print(llama_cpp.__version__)': + type: eval + description: The expression to obtain the version of the tool authors: - - "@toniher" - - "@lucacozzuto" +- "@toniher" +- "@lucacozzuto" maintainers: - - "@toniher" - - "@lucacozzuto" - +- "@toniher" +- "@lucacozzuto" From 20b5d26348c628747268de179fefab024d450300 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Thu, 26 Mar 2026 11:54:03 +0100 Subject: [PATCH 05/10] Upgrade problem with versions and test --- .../huggingface/download/tests/main.nf.test | 6 ++-- .../download/tests/main.nf.test.snap | 30 +++++++++++-------- .../llamacpp-python/run/tests/main.nf.test | 11 +++---- .../run/tests/main.nf.test.snap | 30 +++++++++++-------- 4 files changed, 43 insertions(+), 34 deletions(-) diff --git a/modules/nf-core/huggingface/download/tests/main.nf.test b/modules/nf-core/huggingface/download/tests/main.nf.test index 94d0112862c4..2173c5d32897 100644 --- a/modules/nf-core/huggingface/download/tests/main.nf.test +++ b/modules/nf-core/huggingface/download/tests/main.nf.test @@ -5,7 +5,7 @@ nextflow_process { process "HF_DOWNLOAD" tag "modules" - tag "modules_local" + tag "modules_nfcore" tag "huggingface" tag "huggingface/download" @@ -31,7 +31,7 @@ nextflow_process { { assert process.out.output[0][0] == [ id:'test_model' ] }, { assert file(process.out.output[0][1]).name == "gemma-3-1b-it-Q4_K_M.gguf" }, { assert file(process.out.output[0][1]).size() > 0 }, - { assert snapshot(process.out.versions_huggingface_hub).match() } + { assert snapshot(process.out.findAll { key, val -> key.startsWith('versions') }).match() } ) } } @@ -59,7 +59,7 @@ nextflow_process { { assert process.out.output.size() == 1 }, { assert process.out.output[0][0] == [ id:'test_model' ] }, { assert file(process.out.output[0][1]).name == "gemma-3-1b-it-Q4_K_M.gguf" }, - { assert snapshot(process.out.versions_huggingface_hub).match() } + { assert snapshot(process.out.findAll { key, val -> key.startsWith('versions') }).match() } ) } } diff --git a/modules/nf-core/huggingface/download/tests/main.nf.test.snap b/modules/nf-core/huggingface/download/tests/main.nf.test.snap index 406face5c7a6..5565340150b6 100644 --- a/modules/nf-core/huggingface/download/tests/main.nf.test.snap +++ b/modules/nf-core/huggingface/download/tests/main.nf.test.snap @@ -1,13 +1,15 @@ { "stub - download gguf file": { "content": [ - [ - [ - "HF_DOWNLOAD", - "huggingface_hub", - "1.6.0" + { + "versions_huggingface_hub": [ + [ + "HF_DOWNLOAD", + "huggingface_hub", + "1.6.0" + ] ] - ] + } ], "timestamp": "2026-03-26T08:39:57.919278809", "meta": { @@ -17,13 +19,15 @@ }, "download gguf file": { "content": [ - [ - [ - "HF_DOWNLOAD", - "huggingface_hub", - "1.6.0" + { + "versions_huggingface_hub": [ + [ + "HF_DOWNLOAD", + "huggingface_hub", + "1.6.0" + ] ] - ] + } ], "timestamp": "2026-03-26T08:38:24.630341776", "meta": { @@ -31,4 +35,4 @@ "nextflow": "25.10.4" } } -} \ No newline at end of file +} diff --git a/modules/nf-core/llamacpp-python/run/tests/main.nf.test b/modules/nf-core/llamacpp-python/run/tests/main.nf.test index a3483d6dc9dc..469ce2d8d258 100644 --- a/modules/nf-core/llamacpp-python/run/tests/main.nf.test +++ b/modules/nf-core/llamacpp-python/run/tests/main.nf.test @@ -5,9 +5,10 @@ nextflow_process { process "LLAMACPP_PYTHON_RUN" tag "modules" - tag "modules_local" - tag "llamacpp_python" - tag "llamacpp_python/run" + tag "modules_nfcore" + tag "llamacpp-python" + tag "llamacpp-python/run" + tag "huggingface/download" test("run inference with downloaded gguf model") { @@ -45,7 +46,7 @@ nextflow_process { { assert process.out.output[0][0] == [ id:'test_run' ] }, { assert file(process.out.output[0][1]).name == "output.txt" }, { assert file(process.out.output[0][1]).size() > 0 }, - { assert snapshot(process.out.versions_llama_cpp_python).match() } + { assert snapshot(process.out.findAll { key, val -> key.startsWith('versions') }).match() } ) } } @@ -72,7 +73,7 @@ nextflow_process { { assert process.out.output.size() == 1 }, { assert process.out.output[0][0] == [ id:'test_run' ] }, { assert file(process.out.output[0][1]).name == "output.txt" }, - { assert snapshot(process.out.versions_llama_cpp_python).match() } + { assert snapshot(process.out.findAll { key, val -> key.startsWith('versions') }).match() } ) } } diff --git a/modules/nf-core/llamacpp-python/run/tests/main.nf.test.snap b/modules/nf-core/llamacpp-python/run/tests/main.nf.test.snap index 5f5b167f758b..4bd263f10e6e 100644 --- a/modules/nf-core/llamacpp-python/run/tests/main.nf.test.snap +++ b/modules/nf-core/llamacpp-python/run/tests/main.nf.test.snap @@ -1,13 +1,15 @@ { "run inference with downloaded gguf model": { "content": [ - [ - [ - "LLAMACPP_PYTHON_RUN", - "llama-cpp-python", - "0.3.16" + { + "versions_llama_cpp_python": [ + [ + "LLAMACPP_PYTHON_RUN", + "llama-cpp-python", + "0.3.16" + ] ] - ] + } ], "timestamp": "2026-03-25T18:33:08.596485421", "meta": { @@ -17,13 +19,15 @@ }, "stub - run inference with json prompt": { "content": [ - [ - [ - "LLAMACPP_PYTHON_RUN", - "llama-cpp-python", - "0.3.16" + { + "versions_llama_cpp_python": [ + [ + "LLAMACPP_PYTHON_RUN", + "llama-cpp-python", + "0.3.16" + ] ] - ] + } ], "timestamp": "2026-03-25T17:23:21.997786726", "meta": { @@ -31,4 +35,4 @@ "nextflow": "25.10.4" } } -} \ No newline at end of file +} From c9997f53e502cd3dbf35b47a370512260adc9877 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Thu, 26 Mar 2026 12:27:15 +0100 Subject: [PATCH 06/10] fix precommit linting --- modules/nf-core/huggingface/download/meta.yml | 26 +++++++++---------- modules/nf-core/llamacpp-python/run/meta.yml | 26 +++++++++---------- .../run/resources/usr/bin/llamacpp-python.py | 8 +++--- .../run/tests/data/prompt.json | 1 - 4 files changed, 29 insertions(+), 32 deletions(-) diff --git a/modules/nf-core/huggingface/download/meta.yml b/modules/nf-core/huggingface/download/meta.yml index f540eb08b6c3..b3512b4ea075 100644 --- a/modules/nf-core/huggingface/download/meta.yml +++ b/modules/nf-core/huggingface/download/meta.yml @@ -1,16 +1,16 @@ name: hf_download description: Tool for downloading models from HuggingFace keywords: -- llm -- llama -- ai + - llm + - llama + - ai tools: -- huggingface_hub: - description: "HuggingFace Hub CLI interface" - homepage: "https://huggingface.co/docs/huggingface_hub/guides/cli" - licence: - - "MIT" - identifier: '' + - huggingface_hub: + description: "HuggingFace Hub CLI interface" + homepage: "https://huggingface.co/docs/huggingface_hub/guides/cli" + licence: + - "MIT" + identifier: '' input: - - meta: type: map @@ -59,8 +59,8 @@ topics: type: eval description: The expression to obtain the version of the tool authors: -- "@toniher" -- "@lucacozzuto" + - "@toniher" + - "@lucacozzuto" maintainers: -- "@toniher" -- "@lucacozzuto" + - "@toniher" + - "@lucacozzuto" diff --git a/modules/nf-core/llamacpp-python/run/meta.yml b/modules/nf-core/llamacpp-python/run/meta.yml index 18607a776271..bd8ca208a075 100644 --- a/modules/nf-core/llamacpp-python/run/meta.yml +++ b/modules/nf-core/llamacpp-python/run/meta.yml @@ -1,16 +1,16 @@ name: llamacpp_python_run description: Python wrapper for running locally-hosted LLM with llama.cpp keywords: -- llm -- llama -- ai + - llm + - llama + - ai tools: -- llama-cpp-python: - description: "Python wrapper for llama.cpp LLM inference tool" - homepage: "https://llama-cpp-python.readthedocs.io/en/latest/" - licence: - - "MIT" - identifier: '' + - llama-cpp-python: + description: "Python wrapper for llama.cpp LLM inference tool" + homepage: "https://llama-cpp-python.readthedocs.io/en/latest/" + licence: + - "MIT" + identifier: '' input: - - meta: type: map @@ -62,8 +62,8 @@ topics: type: eval description: The expression to obtain the version of the tool authors: -- "@toniher" -- "@lucacozzuto" + - "@toniher" + - "@lucacozzuto" maintainers: -- "@toniher" -- "@lucacozzuto" + - "@toniher" + - "@lucacozzuto" diff --git a/modules/nf-core/llamacpp-python/run/resources/usr/bin/llamacpp-python.py b/modules/nf-core/llamacpp-python/run/resources/usr/bin/llamacpp-python.py index e9e6123544f3..4e332bca6338 100755 --- a/modules/nf-core/llamacpp-python/run/resources/usr/bin/llamacpp-python.py +++ b/modules/nf-core/llamacpp-python/run/resources/usr/bin/llamacpp-python.py @@ -11,7 +11,7 @@ # Helper to create messages from a text file def create_messages_from_textfile(textfile, system_prompt): try: - with open(textfile, "r", encoding="utf-8") as f: + with open(textfile, encoding="utf-8") as f: content = f.read() return [ {"role": "system", "content": system_prompt.strip()}, @@ -28,7 +28,7 @@ def load_messages(messages_file, system_prompt): print(f"Messages file '{messages_file}' does not exist.", file=sys.stderr) sys.exit(1) try: - with open(messages_file, "r", encoding="utf-8") as f: + with open(messages_file, encoding="utf-8") as f: content = f.read() try: return json.loads(content) @@ -111,9 +111,7 @@ def main(): parser = argparse.ArgumentParser(description="Submit a process with model.") parser.add_argument("-s", "--messages", required=True, help="JSON message") parser.add_argument("-m", "--model", required=True, help="Model used") - parser.add_argument( - "-t", "--temperature", default=0.9, type=float, help="Temperature" - ) + parser.add_argument("-t", "--temperature", default=0.9, type=float, help="Temperature") parser.add_argument("-o", "--output", default="output.txt", help="Output text") parser.add_argument("-c", "--context", default=2048, type=int, help="Context size") parser.add_argument("--chat_format", default="chatml", help="Chat format") diff --git a/modules/nf-core/llamacpp-python/run/tests/data/prompt.json b/modules/nf-core/llamacpp-python/run/tests/data/prompt.json index 7d76ad158bab..52d9ea3e2aa7 100644 --- a/modules/nf-core/llamacpp-python/run/tests/data/prompt.json +++ b/modules/nf-core/llamacpp-python/run/tests/data/prompt.json @@ -2,7 +2,6 @@ { "role": "system", "content": "A chat between a curious user and an artificial intelligence assistant. The assistant gives helpful, detailed, and polite answers to the user's questions" - }, { "role": "user", From 5035e82beb3af788cde1960e79d607d99e7e7686 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Thu, 26 Mar 2026 13:08:09 +0100 Subject: [PATCH 07/10] fix yaml for prettier --- modules/nf-core/huggingface/download/meta.yml | 78 ++++++++--------- modules/nf-core/llamacpp-python/run/meta.yml | 84 +++++++++---------- 2 files changed, 81 insertions(+), 81 deletions(-) diff --git a/modules/nf-core/huggingface/download/meta.yml b/modules/nf-core/huggingface/download/meta.yml index b3512b4ea075..9ca5bed5d613 100644 --- a/modules/nf-core/huggingface/download/meta.yml +++ b/modules/nf-core/huggingface/download/meta.yml @@ -9,55 +9,55 @@ tools: description: "HuggingFace Hub CLI interface" homepage: "https://huggingface.co/docs/huggingface_hub/guides/cli" licence: - - "MIT" - identifier: '' + - "MIT" + identifier: "" input: -- - meta: - type: map - description: | - Groovy Map containing sample information - e.g. `[ id:'sample1' ]`- prompt_file: - - hf_repo: - type: string - description: HuggingFace repository - - hf_file: - type: string - description: HuggingFace GGUF file - - hf_home: - type: string - description: HuggingFace default cache directory -output: - output: - - meta: type: map description: | Groovy Map containing sample information - e.g. `[ id:'sample1' ]` + e.g. `[ id:'sample1' ]`- prompt_file: + - hf_repo: + type: string + description: HuggingFace repository - hf_file: - type: file - description: Downloaded HuggingFace GGUF file - ontologies: [] - versions_huggingface_hub: - - - ${task.process}: type: string - description: The name of the process - - huggingface_hub: + description: HuggingFace GGUF file + - hf_home: type: string - description: The name of the tool - - hf --version 2>&1 | awk '{print \$NF}': - type: eval - description: The expression to obtain the version of the tool + description: HuggingFace default cache directory +output: + output: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'sample1' ]` + - hf_file: + type: file + description: Downloaded HuggingFace GGUF file + ontologies: [] + versions_huggingface_hub: + - - ${task.process}: + type: string + description: The name of the process + - huggingface_hub: + type: string + description: The name of the tool + - hf --version 2>&1 | awk '{print \$NF}': + type: eval + description: The expression to obtain the version of the tool topics: versions: - - - ${task.process}: - type: string - description: The name of the process - - huggingface_hub: - type: string - description: The name of the tool - - hf --version 2>&1 | awk '{print \$NF}': - type: eval - description: The expression to obtain the version of the tool + - - ${task.process}: + type: string + description: The name of the process + - huggingface_hub: + type: string + description: The name of the tool + - hf --version 2>&1 | awk '{print \$NF}': + type: eval + description: The expression to obtain the version of the tool authors: - "@toniher" - "@lucacozzuto" diff --git a/modules/nf-core/llamacpp-python/run/meta.yml b/modules/nf-core/llamacpp-python/run/meta.yml index bd8ca208a075..70d7bbf4f162 100644 --- a/modules/nf-core/llamacpp-python/run/meta.yml +++ b/modules/nf-core/llamacpp-python/run/meta.yml @@ -9,58 +9,58 @@ tools: description: "Python wrapper for llama.cpp LLM inference tool" homepage: "https://llama-cpp-python.readthedocs.io/en/latest/" licence: - - "MIT" - identifier: '' + - "MIT" + identifier: "" input: -- - meta: - type: map - description: | - Groovy Map containing sample information - e.g. `[ id:'sample1' ]`- prompt_file: - - prompt_file: - type: file - description: | - Prompt file - Structure: [ val(meta), path(prompt_file) ] - ontologies: [] - - gguf_model: - type: file - description: | - GGUF model - Structure: [ val(meta), path(gguf_model) ] - ontologies: [] -output: - output: - - meta: type: map description: | Groovy Map containing sample information - e.g. `[ id:'sample1' ]` - - "output.txt": + e.g. `[ id:'sample1' ]`- prompt_file: + - prompt_file: + type: file + description: | + Prompt file + Structure: [ val(meta), path(prompt_file) ] + ontologies: [] + - gguf_model: type: file - description: File with the output of LLM inference request + description: | + GGUF model + Structure: [ val(meta), path(gguf_model) ] ontologies: [] +output: + output: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'sample1' ]` + - "output.txt": + type: file + description: File with the output of LLM inference request + ontologies: [] versions_llama_cpp_python: - - - ${task.process}: - type: string - description: The name of the process - - llama-cpp-python: - type: string - description: The name of the tool - - python3 -c 'import llama_cpp; print(llama_cpp.__version__)': - type: eval - description: The expression to obtain the version of the tool + - - ${task.process}: + type: string + description: The name of the process + - llama-cpp-python: + type: string + description: The name of the tool + - python3 -c 'import llama_cpp; print(llama_cpp.__version__)': + type: eval + description: The expression to obtain the version of the tool topics: versions: - - - ${task.process}: - type: string - description: The name of the process - - llama-cpp-python: - type: string - description: The name of the tool - - python3 -c 'import llama_cpp; print(llama_cpp.__version__)': - type: eval - description: The expression to obtain the version of the tool + - - ${task.process}: + type: string + description: The name of the process + - llama-cpp-python: + type: string + description: The name of the tool + - python3 -c 'import llama_cpp; print(llama_cpp.__version__)': + type: eval + description: The expression to obtain the version of the tool authors: - "@toniher" - "@lucacozzuto" From 2c796de96acc5514afcb7924758686d1d952bcc8 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Thu, 26 Mar 2026 13:44:02 +0100 Subject: [PATCH 08/10] fix retrieval of version for huggingface --- modules/nf-core/huggingface/download/main.nf | 2 +- modules/nf-core/huggingface/download/meta.yml | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/modules/nf-core/huggingface/download/main.nf b/modules/nf-core/huggingface/download/main.nf index 63eef3a5bcb2..78c6211ac34f 100644 --- a/modules/nf-core/huggingface/download/main.nf +++ b/modules/nf-core/huggingface/download/main.nf @@ -10,7 +10,7 @@ process HF_DOWNLOAD { output: tuple val(meta), path(hf_file), emit: output - tuple val("${task.process}"), val("huggingface_hub"), eval("hf --version 2>&1 | awk '{print \$NF}'"), topic: versions, emit: versions_huggingface_hub + tuple val("${task.process}"), val("huggingface_hub"), eval("hf --version 2>&1 | tail -n1 | awk '{print \$NF}'"), topic: versions, emit: versions_huggingface_hub when: task.ext.when == null || task.ext.when diff --git a/modules/nf-core/huggingface/download/meta.yml b/modules/nf-core/huggingface/download/meta.yml index 9ca5bed5d613..a3186bce7b07 100644 --- a/modules/nf-core/huggingface/download/meta.yml +++ b/modules/nf-core/huggingface/download/meta.yml @@ -44,7 +44,7 @@ output: - huggingface_hub: type: string description: The name of the tool - - hf --version 2>&1 | awk '{print \$NF}': + - hf --version 2>&1 | tail -n1 | awk '{print \$NF}': type: eval description: The expression to obtain the version of the tool topics: @@ -55,7 +55,7 @@ topics: - huggingface_hub: type: string description: The name of the tool - - hf --version 2>&1 | awk '{print \$NF}': + - hf --version 2>&1 | tail -n1 | awk '{print \$NF}': type: eval description: The expression to obtain the version of the tool authors: From ff7039c53d6010eea6b8d94d7bf084820c2fb86f Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Thu, 26 Mar 2026 14:02:28 +0100 Subject: [PATCH 09/10] importing nextflow.config from HF_DOWNLOAD --- modules/nf-core/llamacpp-python/run/tests/nextflow.config | 3 +++ 1 file changed, 3 insertions(+) diff --git a/modules/nf-core/llamacpp-python/run/tests/nextflow.config b/modules/nf-core/llamacpp-python/run/tests/nextflow.config index 7a6b3c247728..6806a86ca3ef 100644 --- a/modules/nf-core/llamacpp-python/run/tests/nextflow.config +++ b/modules/nf-core/llamacpp-python/run/tests/nextflow.config @@ -1,6 +1,9 @@ nextflow.enable.moduleBinaries = true process { + withName: 'HF_DOWNLOAD' { + containerOptions = { workflow.profile.contains('docker') ? "--volume ${projectDir}/hf_cache:${projectDir}/hf_cache" : '' } + } withName: 'LLAMACPP_PYTHON_RUN' { ext.args = "--seed 42" } From fb1768c4e6621e3abcf993da4e532c35051ab796 Mon Sep 17 00:00:00 2001 From: Toni Hermoso Pulido Date: Thu, 26 Mar 2026 14:51:46 +0100 Subject: [PATCH 10/10] adding hf_cache for setup as well --- modules/nf-core/llamacpp-python/run/tests/main.nf.test | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/modules/nf-core/llamacpp-python/run/tests/main.nf.test b/modules/nf-core/llamacpp-python/run/tests/main.nf.test index 469ce2d8d258..dc789505242d 100644 --- a/modules/nf-core/llamacpp-python/run/tests/main.nf.test +++ b/modules/nf-core/llamacpp-python/run/tests/main.nf.test @@ -22,7 +22,8 @@ nextflow_process { input[0] = [ [ id:'test_model' ], "ggml-org/gemma-3-1b-it-GGUF", - "gemma-3-1b-it-Q4_K_M.gguf" + "gemma-3-1b-it-Q4_K_M.gguf", + "./hf_cache" ] """ }