From 7699aa408440982ca345c467ef4b7d619243ab91 Mon Sep 17 00:00:00 2001 From: Ohad Livne Date: Sat, 15 Nov 2025 16:35:19 +0200 Subject: [PATCH 1/9] Query the Ollama server for the list of installed models --- .config/emacs/init.el | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/.config/emacs/init.el b/.config/emacs/init.el index e3a988b..152bc40 100644 --- a/.config/emacs/init.el +++ b/.config/emacs/init.el @@ -306,6 +306,14 @@ auto-mode-alist)) ) +(defun list-ollama-models () + "Query the local Ollama server for the list of installed models." + (condition-case error-var + (mapcar #'intern (mapcar #'car (mapcar #'split-string (cdr (process-lines "podllama" "list"))))) + (error + (message "Failed to list local models: %s" error-var) + ()))) + (use-package gptel :hook ; keep-sorted start @@ -328,7 +336,7 @@ ) (gptel-make-ollama "Ollama" :stream t - :models '(llama3.2:latest) + :models (list-ollama-models) ) ) From 89d667542ad11588c5827220837e4f96fcb33f1c Mon Sep 17 00:00:00 2001 From: Ohad Livne Date: Sat, 15 Nov 2025 16:34:36 +0200 Subject: [PATCH 2/9] Display advanced options in the gptel menu --- .config/emacs/init.el | 1 + 1 file changed, 1 insertion(+) diff --git a/.config/emacs/init.el b/.config/emacs/init.el index 152bc40..ddd01e1 100644 --- a/.config/emacs/init.el +++ b/.config/emacs/init.el @@ -326,6 +326,7 @@ ; keep-sorted start (gptel-backend (gptel-get-backend "Ollama")) (gptel-default-mode 'org-mode) + (gptel-expert-commands t) (gptel-highlight-methods '(face margin)) (gptel-model 'llama3.2:latest) ; keep-sorted end From f533b3ef76df799391d81a1693ef46bea20a3a0f Mon Sep 17 00:00:00 2001 From: Ohad Livne Date: Sat, 15 Nov 2025 16:33:31 +0200 Subject: [PATCH 3/9] Start the Ollama server automatically on boot --- .config/containers/systemd/ollama.container | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.config/containers/systemd/ollama.container b/.config/containers/systemd/ollama.container index 6ae7f6c..b6475ab 100644 --- a/.config/containers/systemd/ollama.container +++ b/.config/containers/systemd/ollama.container @@ -11,7 +11,7 @@ Volume=%h/.local/share/ollama:/root/.ollama:ro,z # keep-sorted end [Install] -WantedBy=multi-user.target +WantedBy=default.target [Service] # keep-sorted start From 59583b296a377275b64e36590bdf39b11014ecf1 Mon Sep 17 00:00:00 2001 From: Ohad Livne Date: Sat, 15 Nov 2025 21:29:19 +0200 Subject: [PATCH 4/9] Support restricted one-off uses of language models --- .local/bin/podllama | 52 ++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 49 insertions(+), 3 deletions(-) diff --git a/.local/bin/podllama b/.local/bin/podllama index 947b0d0..ae723dc 100755 --- a/.local/bin/podllama +++ b/.local/bin/podllama @@ -3,7 +3,53 @@ set -euo pipefail IFS=$'\n\t' +if ! PARSED_OPTIONS=$(getopt -o "" --long "offline,volatile" --name "$0" -- "$@"); then + echo "Error parsing options." >&2 + exit 1 +fi + +eval set -- "$PARSED_OPTIONS" + +offline=false +volatile=false + +while true; do + case "$1" in + --offline) + offline=true + shift + ;; + --volatile) + volatile=true + shift + ;; + --) + shift + break + ;; + *) + echo "Internal error!" >&2 + exit 1 + ;; + esac +done + mkdir --parents ~/.local/share/ollama/ -pod_id=$(podman run --detach --rm --volume ~/.local/share/ollama/:/root/.ollama ollama:latest) -podman exec --interactive --tty "${pod_id}" ollama "$@" -podman kill "${pod_id}" > /dev/null + +if [[ "true" == "${volatile}" ]]; then + PODMAN=(podman --transient-store) + MOUNTS=() +else + PODMAN=(podman) + MOUNTS=(--volume ~/.local/share/ollama/:/root/.ollama) +fi + +if [[ "true" == "${offline}" ]]; then + NETWORK=(--network none) +else + NETWORK=() +fi + +pod_id=$("${PODMAN[@]}" run --detach --rm "${MOUNTS[@]}" "${NETWORK[@]}" ollama:latest) +"${PODMAN[@]}" exec --interactive --tty "${pod_id}" ollama "$@" +"${PODMAN[@]}" kill "${pod_id}" > /dev/null From 131511a2f72ec7b9aba7f28fcc10266259a91637 Mon Sep 17 00:00:00 2001 From: Ohad Livne Date: Sun, 16 Nov 2025 23:15:12 +0200 Subject: [PATCH 5/9] Use conventional commenting style for Emacs Lisp --- .config/emacs/init.el | 36 ++++++++++++++++++------------------ 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/.config/emacs/init.el b/.config/emacs/init.el index ddd01e1..f85632f 100644 --- a/.config/emacs/init.el +++ b/.config/emacs/init.el @@ -32,7 +32,7 @@ ) load-path)) :config - ; keep-sorted start + ;; keep-sorted start (defalias 'yes-or-no-p 'y-or-n-p) (display-battery-mode) (display-time-mode) @@ -42,9 +42,9 @@ (put 'dired-find-alternate-file 'disabled nil) (set-default-file-modes #o750) (windmove-default-keybindings 'super) - ; keep-sorted end + ;; keep-sorted end :custom - ; keep-sorted start + ;; keep-sorted start (auto-save-interval 20) (auto-save-visited-mode t) (auto-save-visited-predicate #'should-auto-save-current-buffer) @@ -57,7 +57,7 @@ (inhibit-startup-screen t) (show-paren-context-when-offscreen 'overlay) (xref-search-program 'ripgrep) - ; keep-sorted end + ;; keep-sorted end ) (use-package diminish) @@ -75,10 +75,10 @@ ("" . dired-subtree-cycle) ("" . dired-subtree-remove)) :config - ; keep-sorted start + ;; keep-sorted start (defadvice dired-subtree-cycle (after add-icons activate) (revert-buffer)) (defadvice dired-subtree-toggle (after add-icons activate) (revert-buffer)) - ; keep-sorted end + ;; keep-sorted end :custom (dired-subtree-use-backgrounds nil)) @@ -157,7 +157,7 @@ ("M-." . org-open-at-point) ("M-," . org-mark-ring-goto)) :custom - ; keep-sorted start block=yes + ;; keep-sorted start block=yes (org-agenda-start-on-weekday 0) (org-agenda-weekend-days '(5 6)) (org-default-notes-file "~/Documents/notes.org") @@ -172,7 +172,7 @@ "** TODO %?\n %U") )) (org-clock-sound "~/Music/single-ding.wav") - ; keep-sorted end + ;; keep-sorted end ) (use-package org-contrib) @@ -244,10 +244,10 @@ (flymake-show-diagnostics-at-end-of-line t) ) -; Note: debugging Python in a virtualenv requires debugpy to be installed inside the venv +;; Note: debugging Python in a virtualenv requires debugpy to be installed inside the venv (use-package dape) -; Requires poetry to be installed +;; Requires poetry to be installed (use-package poetry) (defun load-python-env () @@ -278,10 +278,10 @@ :config (require 'ein-notebook) :custom - ; keep-sorted start + ;; keep-sorted start (ein:jupyter-default-notebook-directory "~/Projects/notebooks") (ein:output-area-inlined-images t) - ; keep-sorted end + ;; keep-sorted end ) (use-package direnv @@ -316,20 +316,20 @@ (use-package gptel :hook - ; keep-sorted start + ;; keep-sorted start (gptel-mode . gptel-highlight-mode) (gptel-mode . visual-line-mode) (gptel-post-response . gptel-end-of-response) (gptel-post-stream . gptel-auto-scroll) - ; keep-sorted end + ;; keep-sorted end :custom - ; keep-sorted start + ;; keep-sorted start (gptel-backend (gptel-get-backend "Ollama")) (gptel-default-mode 'org-mode) (gptel-expert-commands t) (gptel-highlight-methods '(face margin)) (gptel-model 'llama3.2:latest) - ; keep-sorted end + ;; keep-sorted end :preface (gptel-make-anthropic "Claude" :stream t @@ -348,10 +348,10 @@ (require 'emms-setup) (emms-all) :custom - ; keep-sorted start + ;; keep-sorted start (emms-info-functions '(emms-info-native)) (emms-player-list '(emms-player-mpv)) - ; keep-sorted end + ;; keep-sorted end ) (defun my-qr-selection () From a019feb7cd9ee66c0d220bb393eef34e1a94fc67 Mon Sep 17 00:00:00 2001 From: Ohad Livne Date: Sun, 16 Nov 2025 23:18:34 +0200 Subject: [PATCH 6/9] Reenable autoformatting for Emacs Lisp --- .config/emacs/init.el | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/.config/emacs/init.el b/.config/emacs/init.el index f85632f..5a0c5b2 100644 --- a/.config/emacs/init.el +++ b/.config/emacs/init.el @@ -217,7 +217,6 @@ (use-package apheleia :config (apheleia-global-mode) - (setf (alist-get 'emacs-lisp-mode apheleia-mode-alist nil 'remove) nil) (setf (alist-get 'ruff-isort apheleia-formatters) '("ruff" "check" "-n" @@ -236,10 +235,10 @@ (use-package flymake :ensure nil :bind (:map flymake-mode-map - ("C-c C-l" . flymake-show-buffer-diagnostics) - ("C-x C-l" . flymake-show-project-diagnostics) - ("C-c C-n" . flymake-goto-next-error) - ("C-c C-p" . flymake-goto-prev-error)) + ("C-c C-l" . flymake-show-buffer-diagnostics) + ("C-x C-l" . flymake-show-project-diagnostics) + ("C-c C-n" . flymake-goto-next-error) + ("C-c C-p" . flymake-goto-prev-error)) :custom (flymake-show-diagnostics-at-end-of-line t) ) From 7998f20d52bb80ae97d95fd3ed42085ef72c083c Mon Sep 17 00:00:00 2001 From: Ohad Livne Date: Sun, 16 Nov 2025 22:59:20 +0200 Subject: [PATCH 7/9] Compose a library of known local models --- .config/emacs/site-lisp/local-models.el | 37 +++++++++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 .config/emacs/site-lisp/local-models.el diff --git a/.config/emacs/site-lisp/local-models.el b/.config/emacs/site-lisp/local-models.el new file mode 100644 index 0000000..cddf6e8 --- /dev/null +++ b/.config/emacs/site-lisp/local-models.el @@ -0,0 +1,37 @@ +(defconst gptel--local-models + '( + ;; keep-sorted start + ( + hf.co/Orenguteng/Llama-3.1-8B-Lexi-Uncensored-V2-GGUF:latest + :description "Uncensored model based on Llama-3.1-8b-Instruct" + :context-window 128 + :cutoff-date "2023-12" + ) + ( + hf.co/TheBloke/MythoMax-L2-13B-GGUF:latest + :description "Proficient at both roleplaying and storywriting" + :context-window 32 + ) + ( + hf.co/bartowski/cognitivecomputations_Dolphin-Mistral-24B-Venice-Edition-GGUF:latest + :description "Uncensored version of Mistral 24B" + :context-window 32 + :cutoff-date "2023-10" + ) + ( + llama3.2:latest + :description "Instruction-tuned model optimized for multilingual dialogue" + :context-window 128 + :cutoff-date "2023-12" + ) + ( + mollysama/rwkv-7-g0a3:13.3b + :description "Pure RNN reasoning model, suitable for post-training and fine-tuning" + :context-window 1000 + :cutoff-date "2023-10" + ) + ;; keep-sorted end + ) + "List of known local models and associated properties. +Refer to https://gptel.org/manual.html#models for a description of supported properties" + ) From d187c19d7192221a9b89cbb7194ca7cd3e206778 Mon Sep 17 00:00:00 2001 From: Ohad Livne Date: Mon, 17 Nov 2025 00:17:26 +0200 Subject: [PATCH 8/9] Enrich the Ollama models list with metadata for known models --- .config/emacs/init.el | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/.config/emacs/init.el b/.config/emacs/init.el index 5a0c5b2..5a3e8cb 100644 --- a/.config/emacs/init.el +++ b/.config/emacs/init.el @@ -313,6 +313,13 @@ (message "Failed to list local models: %s" error-var) ()))) +(defun enrich-ollama-models (available library) + "Enrich the available models with metadata from the library of known models." + (mapcar + (lambda (model) + (seq-find (lambda (x) (eq (car x) model)) library model)) + available)) + (use-package gptel :hook ;; keep-sorted start @@ -330,13 +337,14 @@ (gptel-model 'llama3.2:latest) ;; keep-sorted end :preface + (load "local-models.el") (gptel-make-anthropic "Claude" :stream t :key 'gptel-api-key-from-auth-source ) (gptel-make-ollama "Ollama" :stream t - :models (list-ollama-models) + :models (enrich-ollama-models (list-ollama-models) gptel--local-models) ) ) From ed44c92fc9985392f021f67f560f6d2927684a51 Mon Sep 17 00:00:00 2001 From: Ohad Livne Date: Mon, 17 Nov 2025 22:32:05 +0200 Subject: [PATCH 9/9] Rely on pipx's built-in upgrade capabilities --- .local/bin/upgrade | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/.local/bin/upgrade b/.local/bin/upgrade index 95784aa..5ce5ba5 100755 --- a/.local/bin/upgrade +++ b/.local/bin/upgrade @@ -17,10 +17,7 @@ cargo_update() { } pipx_update() { - for venv in $(pipx list --json | jq --raw-output ".venvs | keys[]") - do - pipx upgrade "${venv}" - done + pipx upgrade-all } git_sync_update() {