Add many gptel tools
All checks were successful
BUILD x86_64-linux.picard
UPLOAD x86_64-linux.picard
DOWNLOAD x86_64-linux.picard
CACHIX x86_64-linux.picard
ATTIC x86_64-linux.picard
EVAL x86_64-linux.picard
/ test (push) Successful in -8s

This commit is contained in:
Andrea Ciceri 2025-05-16 16:08:15 +02:00
parent 36ad3ced81
commit 79c98d1e5d
No known key found for this signature in database

View file

@ -570,6 +570,7 @@
(use-package tidal (use-package tidal
:custom ((tidal-interpreter "tidal"))) :custom ((tidal-interpreter "tidal")))
(use-package purescript-mode (use-package purescript-mode
:custom ((project-vc-extra-root-markers '("spago.dhall"))) :custom ((project-vc-extra-root-markers '("spago.dhall")))
:hook ((purescript-mode . eglot-ensure) :hook ((purescript-mode . eglot-ensure)
@ -1038,7 +1039,7 @@ This is meant to be an helper to be called from the window manager."
) )
(gptel-default-mode 'org-mode) (gptel-default-mode 'org-mode)
(gptel-org-branching-context nil) ;; this is cool but I don't feel comfortable with it (gptel-org-branching-context nil) ;; this is cool but I don't feel comfortable with it
(gptel-use-tools nil) (gptel-use-tools 't)
:bind :bind
("C-c a a" . gptel-add) ("C-c a a" . gptel-add)
@ -1053,56 +1054,139 @@ This is meant to be an helper to be called from the window manager."
;; (add-hook 'gptel-post-response-functions 'gptel-end-of-response) ;; (add-hook 'gptel-post-response-functions 'gptel-end-of-response)
;; (add-hook 'gptel-post-stream-hook 'gptel-auto-scroll) ;; (add-hook 'gptel-post-stream-hook 'gptel-auto-scroll)
(setq gptel-tools (mapcar (lambda (tool) (apply #'gptel-make-tool tool)) (defun ccr/edit-buffer (buffer-name old-string new-string)
'(( "In BUFFER-NAME, replace OLD-STRING with NEW-STRING."
:name "create_file" (with-current-buffer buffer-name
:function (lambda (path filename content) (let ((case-fold-search nil)) ;; Case-sensitive search
(let ((full-path (expand-file-name filename path))) (save-excursion
(with-temp-buffer (goto-char (point-min))
(let ((count 0))
(while (search-forward old-string nil t)
(setq count (1+ count)))
(if (= count 0)
(format "Error: Could not find text to replace in buffer %s" buffer-name)
(if (> count 1)
(format "Error: Found %d matches for the text to replace in buffer %s" count buffer-name)
(goto-char (point-min))
(search-forward old-string)
(replace-match new-string t t)
(format "Successfully edited buffer %s" buffer-name))))))))
(defun ccr/replace-buffer (buffer-name content)
"Completely replace contents of BUFFER-NAME with CONTENT."
(with-current-buffer buffer-name
(erase-buffer)
(insert content) (insert content)
(write-file full-path)) (format "Buffer replaced: %s" buffer-name)))
(format-read "Created file %s in %s" filename path)))
:description "Create a new file with the specified content" (setq gptel-tools `(
:args (list '(:name "path" ,(gptel-make-tool
:function (lambda (url)
(with-current-buffer (url-retrieve-synchronously url)
(goto-char (point-min))
(forward-paragraph)
(let ((dom (libxml-parse-html-region (point) (point-max))))
(run-at-time 0 nil #'kill-buffer (current-buffer))
(with-temp-buffer
(shr-insert-document dom)
(buffer-substring-no-properties (point-min) (point-max))))))
:name "read_url"
:description "Fetch and read the contents of a URL"
:args (list '(:name "url"
:type string :type string
:description "The directory where to create the file") :description "The URL to read"))
'(:name "filename" :category "web")
,(gptel-make-tool
:function (lambda (filepath)
(with-temp-buffer
(insert-file-contents (expand-file-name filepath))
(buffer-string)))
:name "read_file"
:description "Read and display the contents of a file"
:args (list '(:name "filepath"
:type string :type string
:description "The name of the file to create") :description "Path to the file to read. Supports relative paths and ~."))
'(:name "content" :category "filesystem")
,(gptel-make-tool
:function (lambda (directory)
(mapconcat #'identity
(directory-files directory)
"\n"))
:name "list_directory"
:description "List the contents of a given directory"
:args (list '(:name "directory"
:type string :type string
:description "The content to write to the file")) :description "The path to the directory to list"))
:category "filesystem" :category "filesystem")
) ,(gptel-make-tool
;; ( :function (lambda () (mapcar 'buffer-name (buffer-list)))
;; :name "run_command" :name "list_buffers"
;; :confirm 't :description "Return a list containing all the Emacs buffers"
;; :function (lambda (command) :category "emacs")
;; (shell-command-to-string command)) ,(gptel-make-tool
;; :description "Run arbitrary commands" :function (lambda (buffer)
;; :args (list '(:name "command" (unless (buffer-live-p (get-buffer buffer))
;; :type string (error "Error: buffer %s is not live." buffer))
;; :description "The content to run e.g. 'ls *' or 'fd <pattern> <path>'")) (with-current-buffer buffer
;; ) (buffer-substring-no-properties (point-min) (point-max))))
( :name "read_buffer"
:name "get_weather" :description "Return the contents of an Emacs buffer"
:function (lambda (location) :args (list '(:name "buffer"
(url-retrieve-synchronously "api.weather.com/..."
location unit))
:description "Get the current weather in a given location"
:args (list '(:name "location"
:type string :type string
:description "The city and state, e.g. San Francisco, CA") :description "The name of the buffer whose contents are to be retrieved"))
'(:name "unit" :category "emacs")
,(gptel-make-tool
:function (lambda (buffer text)
(with-current-buffer (get-buffer-create buffer)
(save-excursion
(goto-char (point-max))
(insert text)))
(format "Appended text to buffer %s" buffer))
:name "append_to_buffer"
:description "Append text to an Emacs buffer. If the buffer does not exist, it will be created."
:confirm t
:args (list '(:name "buffer"
:type string :type string
:enum ["celsius" "farenheit"] :description "The name of the buffer to append text to.")
:description '(:name "text"
"The unit of temperature, either 'celsius' or 'fahrenheit" :type string
:optional t :description "The text to append to the buffer."))
:category "emacs")
,(gptel-make-tool
:name "EditBuffer"
:function #'ccr/edit-buffer
:description "Edits Emacs buffers"
:confirm t
:args '((:name "buffer_name"
:type string
:description "Name of the buffer to modify"
:required t)
(:name "old_string"
:type string
:description "Text to replace (must match exactly)"
:required t)
(:name "new_string"
:type string
:description "Text to replace old_string with"
:required t))
:category "edit")
,
(gptel-make-tool
:name "ReplaceBuffer"
:function #'ccr/replace-buffer
:description "Completely overwrites buffer contents"
:confirm t
:args '((:name "buffer_name"
:type string
:description "Name of the buffer to overwrite"
:required t)
(:name "content"
:type string
:description "Content to write to the buffer"
:required t))
:category "edit")
)) ))
)
))
)
(defun ccr/suggest-eshell-command () (defun ccr/suggest-eshell-command ()
(interactive) (interactive)