Sanitize gpt-model value just in time

* gptel-transient.el (gptel-menu): Sanitize model if it's not in
the backend.

* gptel.el (gptel--sanitize-model): New helper.

* gptel.el (gptel-send): Also sanitize model in non-prefixed gptel-send.
This commit is contained in:
João Távora 2024-01-18 02:33:39 +00:00 committed by Karthik Chikmagalur
parent 50fb34ab7c
commit 7b19cdf117
2 changed files with 23 additions and 2 deletions

View file

@ -156,8 +156,10 @@ which see."
(lambda () (if (derived-mode-p 'prog-mode)
"Refactor" "Rewrite"))
gptel-rewrite-menu)]
["Send" (gptel--suffix-send)]])
["Send" (gptel--suffix-send)]]
(interactive)
(gptel--sanitize-model)
(transient-setup 'gptel-menu))
;; ** Prefix for setting the system prompt.
(defun gptel-system-prompt--setup (_)

View file

@ -859,6 +859,7 @@ waiting for the response."
(if (and arg (require 'gptel-transient nil t))
(call-interactively #'gptel-menu)
(message "Querying %s..." (gptel-backend-name gptel-backend))
(gptel--sanitize-model)
(let* ((response-pt
(if (use-region-p)
(set-marker (make-marker) (region-end))
@ -1115,6 +1116,22 @@ See `gptel-curl--get-response' for its contents.")
(list nil (concat "(" http-msg ") Could not parse HTTP response.")
"Could not parse HTTP response.")))))
(cl-defun gptel--sanitize-model (&key (backend gptel-backend)
(shoosh t))
"Check if `gptel-model' is available in BACKEND, adjust accordingly.
If SHOOSH is true, don't issue a warning."
(let* ((available (gptel-backend-models backend)))
(unless (member gptel-model available)
(let ((fallback (car available)))
(unless shoosh
(display-warning
'gptel
(format (concat "Preferred `gptel-model' \"%s\" not"
"supported in \"%s\", using \"%s\" instead")
gptel-model (gptel-backend-name backend) fallback)))
(setq-local gptel-model fallback)))))
;;;###autoload
(defun gptel (name &optional _ initial interactivep)
"Switch to or start ChatGPT session with NAME.
@ -1154,6 +1171,8 @@ INTERACTIVEP is t when gptel is called interactively."
(text-mode)
(visual-line-mode 1))
(t (funcall gptel-default-mode)))
(gptel--sanitize-model :backend (default-value 'gptel-backend)
:shoosh nil)
(unless gptel-mode (gptel-mode 1))
(goto-char (point-max))
(skip-chars-backward "\t\r\n")