aboutsummaryrefslogtreecommitdiffstats
path: root/elisp/ai-query.el
blob: 80c99188e55945928756bf8b2b3b17012918d927 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
;;; ai-query.el --- Query an AI over the lakera gandalf game -*- lexical-binding: t; -*-
;;
;; Copyright (C) 2024 Óscar Nájera
;;
;; Author: Óscar Nájera <hi@oscarnajera.com>
;; Maintainer: Óscar Nájera <hi@oscarnajera.com>
;; Created: July 22, 2024
;; Modified: July 22, 2024
;; Version: 0.0.1
;; Package-Requires: ((emacs "27.1"))
;;
;; This file is not part of GNU Emacs.
;;
;;; Commentary:
;;
;;  Query an AI over the lakera gandalf game
;;
;;; Code:

(require 'subr-x)
(require 'markdown-mode)

;; Silence byte-compiler.
(defvar url-http-end-of-headers)

(defconst ai-query-api
  "https://gandalf.lakera.ai/api/send-message"
  "AI security endpoint, use it for queries.")

(defun ai-query-request (prompt)
  "Query the API with this PROMPT."
  (thread-first
    (if (use-region-p)
        (buffer-substring-no-properties (region-beginning) (region-end))
      (read-string "What is your question? "))
    (list)
    (interactive))
  (let ((url-request-method "POST")
        (url-request-extra-headers
         '(("Content-Type" . "application/x-www-form-urlencoded")))
        (url-request-data
         (thread-first
           (list 'prompt prompt)
           (cons '((defender "baseline")))
           (url-build-query-string))))
    (with-current-buffer (get-buffer-create "*AI reply*")
      (markdown-mode)
      (erase-buffer)
      (insert "# Question\n" prompt)
      (insert "\n\n# Answer\n\n"
              (with-current-buffer
                  (url-retrieve-synchronously ai-query-api)
                (goto-char url-http-end-of-headers)
                (gethash "answer" (json-parse-buffer))))
      (display-buffer (current-buffer)))))

(provide 'ai-query)
;;; ai-query.el ends here