(defun my-eval-string (string)
"Evaluate STRING like `eval' does."
(pcase-let ((`(,expression . ,length) (read-from-string string)))
(unless (= (length string) length)
(user-error "Invalid expression (did you forget `progn'?): %s" string))
(eval expression)))
(with-eval-after-load 'gptel
(add-to-list
'gptel-tools
(gptel-make-tool
:category "Emacs"
:name "emacs_lisp_evaluate_expression"
:function (lambda (expression)
;; HACK Llama does not know what a sexp is.
(let ((expression-fixed (format "(progn %s)" expression)))
(let ((inhibit-message t))
(message "LLM executing: %s" expression))
(my-eval-string expression)))
:description "Evaluate Emacs Lisp symbolic expresssion"
:args '(( :name "sexp"
:type "string"
:description "The expression to be evaluated.")))))