fix: add --no-push / ollama_push: false to keep Ollama exports local (fixes #6242)

Co-Authored-By: Claude Opus 5.5 <[email protected]>
This commit is contained in:
MervinPraisonandClaude Opus 5.5 committed 2026-11-05 08:03:53 +00:00
1 parent 87bf746dba
commit ffa3068203
6 files changed
+37 -2

No files matched your search

@@ -717,6 +717,9 @@ def train_export(
mtp_draft: bool = typer.Option(
False, "--mtp-draft/--no-mtp-draft",
help="Also download the stock MTP drafter (Gemma-4 only) for fast inference"),
push: bool = typer.Option(
True, "--push/--no-push",
help="ollama: push to ollama.com after `ollama create` (--no-push keeps it local)"),
):
"""
Export / publish an ALREADY-trained model without re-running training.
@@ -726,6 +729,7 @@ def train_export(
praisonai-train export gguf --model-dir lora_model --quant q4_k_m # local .gguf
praisonai-train export gguf --model-dir lora_model --hf me/my-model # local + push
praisonai-train export ollama --model-dir lora_model --ollama me/my-model --quant q4_k_m
praisonai-train export ollama --model-dir lora_model --ollama my-model --no-push # local only
"""
from ..output.console import get_output_controller
@@ -765,6 +769,8 @@ def train_export(
cfg["hf_model_name"] = hf
if ollama:
cfg["ollama_model"] = ollama
if not push:
cfg["ollama_push"] = False
# Recover the model name (drives chat-template selection) from --base-model or
# the trained model's config.json (_name_or_path), falling back to the dir name.
@@ -1,4 +1,5 @@
ollama_save: "true"
ollama_push: "true" # set "false" to keep the Ollama model local (no upload to ollama.com)
huggingface_save: "true"
train: "true"
@@ -220,8 +220,9 @@ def create_and_push_ollama_model(
model_parameters: str,
modelfile_content: str,
quantization: Optional[str] = None,
push: bool = True,
) -> None:
"""Create and push an Ollama model with proper daemon management.
"""Create (and by default push) an Ollama model with proper daemon management.
Args:
ollama_model: Name of the Ollama model
@@ -229,6 +230,8 @@ def create_and_push_ollama_model(
modelfile_content: Content for the Modelfile
quantization: Optional quantization (e.g. "q4_k_m") passed to
``ollama create --quantize`` so the model isn't stored as huge f16.
push: When False, stop after a successful ``ollama create`` and keep the
model local-only (nothing is uploaded to ollama.com).
Raises:
RuntimeError: If ollama create/push operations fail (with actionable guidance)
@@ -259,6 +262,10 @@ def create_and_push_ollama_model(
f"{(create.stderr or create.stdout or '').strip()}"
)
if not push:
print(f"Created local Ollama model `{tag}` (not pushed). Run it with: ollama run {tag}")
return
# Push with captured output so a 401/403 becomes an actionable message rather
# than a raw non-zero exit.
result = subprocess.run(["ollama", "push", tag], capture_output=True, text=True)
@@ -545,6 +545,7 @@ class TrainModel:
"optim", "weight_decay", "lr_scheduler_type", "seed", "output_dir",
"assistant_only_loss", "train_on_responses_only", "save_steps",
"train", "huggingface_save", "huggingface_save_gguf", "ollama_save",
"ollama_push",
"method", "beta", "max_prompt_length", "desirable_weight", "undesirable_weight",
"reward_funcs", "num_generations", "max_completion_length",
"embedding_learning_rate",
@@ -1784,6 +1785,7 @@ class TrainModel:
self.config.get('model_parameters', 'latest'),
modelfile_content,
quantization=self.config.get('quantization_method'),
push=self._flag(self.config.get('ollama_push'), default=True),
)
def run(self):
@@ -313,7 +313,8 @@ PARAMETER top_p 0.9
create_and_push_ollama_model(
self.config['ollama_model'],
self.config['model_parameters'],
modelfile_content
modelfile_content,
push=self._flag(self.config.get('ollama_push'), default=True),
)
def run(self):
@@ -412,3 +412,21 @@ def test_export_command_bad_target_exits(monkeypatch, tmp_path):
quant=None,
base_model=None,
)
def test_ollama_no_push_skips_push(monkeypatch, tmp_path):
"""push=False stops after `ollama create`; nothing is sent to ollama.com."""
monkeypatch.chdir(tmp_path)
monkeypatch.setattr(ollama_mod, "_check_ollama_disk", lambda *_a, **_k: None)
monkeypatch.setattr(ollama_mod, "ensure_ollama_running", lambda *_a, **_k: None)
calls = []
def _fake_run(cmd, *a, **k):
calls.append(cmd)
return types.SimpleNamespace(returncode=0, stdout="", stderr="")
monkeypatch.setattr(ollama_mod.subprocess, "run", _fake_run)
ollama_mod.create_and_push_ollama_model(
"my-model", "latest", "FROM ./model\n", push=False)
assert [c[1] for c in calls] == ["create"]
assert not any("push" in c for c in calls)