18 Jun 2023
Google Bard and Emacs
After reading a Google blog post on Bard's increasing ability for reasoning about source code, I thought I would give it a try. The issue is that not like OpenAI, Bard currently does not have an http API that I can use via curl. I googled around and came across the `bard-rs` project here: https://github.com/Alfex4936/Bard-rs. So I followed the excellent instruction to get set up using bard from command line and its is pretty solid. I used following Elisp to use `bard-rs` from Emacs' compilation buffer here:
(defun kcompilation-start (cmd name &optional mode)
(let* ((compile-command nil)
(compilation-save-buffers-predicate 'ignore)
(compilation-buffer
(compilation-start cmd
(if (equal mode 'read-only) nil t)
(lambda (m)
(or (when (boundp 'name)
(format "*%s*" name))
(buffer-name))))))
(when current-prefix-arg
(with-current-buffer compilation-buffer
(switch-to-prev-buffer (get-buffer-window (current-buffer)))))
(message (format "Running %s in %s ..." cmd name))))
(defun kprompt-bard (&optional p)
"Prompts for input to send it to `bard` using `bard-rs` in
*bard-prompt* buffer. If mark-active, uses the text in the region
as the prompt"
(interactive "P")
(let* ((bs "bard-prompt")
(bname (format "*%s*" bs))
(bname (if (get-buffer bname)
bname
(progn (kcompilation-start "bard-rs -e ~/.env" bs)
bname)))
(prompt (if mark-active
(replace-regexp-in-string
"\n"
""
(buffer-substring-no-properties (region-beginning) (region-end)))
(read-string "AI Chat Prompt: "))))
(with-current-buffer (pop-to-buffer bname)
(when p
(end-of-buffer)
(insert "!reset")
(comint-send-input)
(end-of-buffer)
(insert prompt)
(comint-send-input))
(when (not p)
(end-of-buffer)
(insert prompt)
(comint-send-input)))))
You can bind `kprompt-bard` to any key of your choice and start interacting with Google bard from the comfort of Emacs' buffer.