Skip to content

Commit 285856e

Browse files
authored
gptel-transient: Ensure user enters a number when prompted (#637)
* gptel-transient.el (gptel--transient-read-variable, gptel--transient-read-number): New function that uses standard `read-number' to read a numeric value, returning nil for default. Drop the read-variable function since we were only using it for prompting numbers. * gptel-transdient.el (gtpel--infix-num-messages-to-send, gptel--infix-max-tokens, gptel--infix-temperature): Use the new function as :reader.
1 parent 9f3acc3 commit 285856e

File tree

1 file changed

+16
-10
lines changed

1 file changed

+16
-10
lines changed

gptel-transient.el

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -174,13 +174,19 @@ will toggle its visibility state."
174174
prefix max-width nil nil
175175
'ellipsis))))))))
176176

177-
(defun gptel--transient-read-variable (prompt initial-input history)
178-
"Read value from minibuffer and interpret the result as a Lisp object.
179-
180-
PROMPT, INITIAL-INPUT and HISTORY are as in the Transient reader
181-
documention."
182-
(ignore-errors
183-
(read-from-minibuffer prompt initial-input read-expression-map t history)))
177+
(defun gptel--transient-read-number (prompt initial-input history)
178+
"Read a numeric value from the minibuffer.
179+
180+
PROMPT, INITIAL-INPUT and HISTORY are as in the transient reader
181+
documention. Return nil if user does not provide a number, for default."
182+
;; Workaround for buggy transient behaviour when dealing with
183+
;; non-string values. See: https://github.com/magit/transient/issues/172
184+
(when-let ((val (symbol-value history)))
185+
(when (not (stringp (car val)))
186+
(setcar val (number-to-string (car val)))))
187+
(let* ((minibuffer-default-prompt-format "")
188+
(num (read-number prompt -1 history)))
189+
(if (= num -1) nil num)))
184190

185191
(defun gptel-system-prompt--format (&optional message)
186192
"Format the system MESSAGE for display in gptel's transient menus.
@@ -868,7 +874,7 @@ include."
868874
:format " %k %v %d"
869875
:key "-n"
870876
:prompt "Number of past messages to include for context (leave empty for all): "
871-
:reader 'gptel--transient-read-variable)
877+
:reader 'gptel--transient-read-number)
872878

873879
(transient-define-infix gptel--infix-max-tokens ()
874880
"Max tokens per response.
@@ -883,7 +889,7 @@ responses."
883889
:display-nil 'auto
884890
:key "-c"
885891
:prompt "Response length in tokens (leave empty: default, 80-200: short, 200-500: long): "
886-
:reader 'gptel--transient-read-variable)
892+
:reader 'gptel--transient-read-number)
887893

888894
(transient-define-infix gptel--infix-provider ()
889895
"AI Provider for Chat."
@@ -939,7 +945,7 @@ responses."
939945
:set-value #'gptel--set-with-scope
940946
:key "-T"
941947
:prompt "Temperature controls the response randomness (0.0-2.0, leave empty for API default): "
942-
:reader 'gptel--transient-read-variable)
948+
:reader 'gptel--transient-read-number)
943949

944950
(transient-define-infix gptel--infix-track-response ()
945951
"Distinguish between user messages and LLM responses.

0 commit comments

Comments
 (0)