1
0
Fork 0
kagi.el/README.org

275 lines
12 KiB
Org Mode
Raw Normal View History

2023-12-23 18:17:08 +00:00
#+title: kagi.el README
#+author: Bram Schoenmakers
#+macro: issue [[https://codeberg.org/bram85/kagi.el/issues/$1][issue #$1]]
#+macro: pr [[https://codeberg.org/bram85/kagi.el/pulls/$1][PR #$1]]
2023-12-23 18:17:08 +00:00
#+begin_export html
<a href="https://melpa.org/#/kagi"><img alt="MELPA" src="https://melpa.org/packages/kagi-badge.svg"/></a>
<a href="https://stable.melpa.org/#/kagi"><img alt="MELPA Stable" src="https://stable.melpa.org/packages/kagi-badge.svg"/></a>
#+end_export
2023-12-23 18:17:08 +00:00
* Introduction
2023-12-29 22:16:06 +00:00
This Emacs package provides the following functionalities from the [[https://www.kagi.com][Kagi search engine]]:
2023-12-23 18:17:08 +00:00
- FastGPT :: Kagi's open source LLM offering, as a shell inspired by [[https://github.com/xenodium/chatgpt-shell][xenodium's chatgpt-shell]].
- Universal Summarizer :: Summarizes texts, webpages, videos and more.
2023-12-23 18:17:08 +00:00
2024-02-08 21:03:23 +00:00
Both functions are accessed through Kagi's [[https://help.kagi.com/kagi/api/overview.html][APIs]]. Before a call can be made, some setup should be done on the Kagi website (see below).
2024-01-13 13:20:20 +00:00
[[file:img/fastgpt.png]]
2023-12-29 07:25:16 +00:00
* Commands and functions
** FastGPT
- =kagi-fastgpt-shell= :: Opens a shell buffer in a new window where prompts can be typed. This Kagi FastGPT typically returns output based on actual search results. When point is on one of the listed URLs, press =C-c RET= to open it.
- =kagi-fastgpt-prompt= :: Enter a prompt in the minibuffer and show the result in a separate buffer. With a universal prefix (=C-u=), the result is inserted at point.
- =kagi-fastgpt= :: Function to retrieve a FastGPT response, to be used from Lisp code.
kagi.el has some functions that use FastGPT to perform certain operations on text:
- =kagi-translate= :: Translates strings or complete buffers to another language (including programming languages).
2024-02-08 21:58:26 +00:00
- =kagi-proofread= :: Proofread a string or buffer.
** Universal Summarizer
2024-01-14 09:05:07 +00:00
- =kagi-summarize-buffer= :: Summarizes the content of a buffer.
- =kagi-summarize-region= :: Similarly, the text inside the region is summarized.
- =kagi-summarize-url= :: Prompts for a URL of which a summary is composed and displayed.
2023-12-29 07:25:16 +00:00
- =kagi-summarize= :: Function to retrieve a summary from a text or URL, to be used from Lisp code.
2023-12-23 18:17:08 +00:00
2024-01-14 09:05:07 +00:00
The summarize commands accept a single universal prefix, which allows you to:
- insert the summary at point;
2024-01-14 09:11:45 +00:00
- choose a (different) target language;
- choose which summary engine to use.
2024-01-14 09:05:07 +00:00
2023-12-28 17:02:12 +00:00
Note that texts submitted to Kagi are subject to their [[https://kagi.com/privacy#Summarizer][Privacy Policy]].
2023-12-23 18:17:08 +00:00
* Installation and configuration
kagi.el is available on [[https://melpa.org/#/kagi][MELPA]].
2023-12-23 18:17:08 +00:00
To install from Git, clone with:
2023-12-23 18:17:08 +00:00
: git clone https://codeberg.org/bram85/kagi.el.git /path/to/kagi.el
Note that kagi.el has a dependency on the [[https://melpa.org/#/shell-maker][shell-maker package]], which is available on MELPA.
2024-02-08 21:03:23 +00:00
You may want to load and configure the package with ~use-package~, for example put the following in your Emacs init file:
2023-12-23 18:17:08 +00:00
#+begin_src elisp
(use-package kagi
:ensure t
2023-12-23 18:17:08 +00:00
:custom
(kagi-api-token "ABCDEF")
;; or use a function, e.g. with the password-store package:
(kagi-api-token (lambda () (password-store-get "Kagi/API")))
;; Univernal Summarizer settings
(kagi-summarizer-engine "cecil")
(kagi-summarizer-default-language "EN")
(kagi-summarizer-cache t)
:custom-face
;; kagi-code defaults to fixed-pitch, but can be overridden as
;; follows:
(kagi-code ((t (:inherit org-verbatim))))
;; likewise for kagi-bold:
(kagi-bold ((t (:inherit modus-themes-bold)))))
2023-12-23 18:17:08 +00:00
#+end_src
2023-12-27 20:09:33 +00:00
The token can be supplied directly as a string, but you could write a lambda to retrieve the token from a more secure location (e.g. with the combination of [[https://passwordstore.org/][pass(1)]] and the password-store package that comes with it).
** Kagi API setup
1. Create a Kagi account if you haven't done so already. An account is free, and comes with 100 trial searches.
2. In [[https://kagi.com/settings?p=billing_api][your account settings]], put a balance for the API part (note that this is a separate balance than the subscription). The recommendation is to start with a one-time charge of $5. A single query ranges from 1 to 5 cents typically, depending on the amount of tokens processed.
3. In [[https://kagi.com/settings?p=api][the API portal]], create an API token. Put the result in ~kagi-api-token~ (or write a function to access it securely).
** Configuration settings
#+begin_src emacs-lisp :exports results :results table :colnames '("Custom variable" "Description")
(let ((rows))
(mapatoms
(lambda (symbol)
(when (and (string-match "\\_<kagi"
(symbol-name symbol))
(custom-variable-p symbol))
(push `(,symbol
,(car
(split-string
(or (get (indirect-variable symbol)
'variable-documentation)
(get symbol 'variable-documentation)
"")
"\n")))
rows))))
(sort rows (lambda (item1 item2)
(string< (car item1) (car item2)))))
#+end_src
#+RESULTS:
2024-02-03 22:03:15 +00:00
| Custom variable | Description |
|----------------------------------------+---------------------------------------------------------|
| kagi-api-token | The Kagi API token. |
| kagi-fastgpt-api-url | The Kagi FastGPT API entry point. |
| kagi-stubbed-responses | Whether the package should return a stubbed response. |
| kagi-summarizer-api-url | The Kagi Summarizer API entry point. |
| kagi-summarizer-cache | Determines whether the Summarizer should cache results. |
| kagi-summarizer-default-language | Default target language of the summary. |
| kagi-summarizer-default-summary-format | The summary format that should be returned. |
| kagi-summarizer-engine | Which summary engine to use. |
*** COMMENT Attribution :noexport:
The code to generate the table of configuration items was inspired by an idea of [[https://xenodium.com/generating-elisp-org-docs/][Álvaro Ramírez]] (a.k.a. xenodium).
2023-12-29 22:16:06 +00:00
** Examples of custom functions
2024-01-14 09:05:07 +00:00
The =kagi-summarize= function allows you to summarize texts or URLs from Emacs Lisp.
By overriding a variable with a =let= construct you can (temporarily) deviate from the default / configured value. A few examples are shown below:
*** Language override
To obtain a Dutch summary of a video you may want to define the following function:
#+begin_src elisp
2023-12-29 22:16:06 +00:00
(defun my/kagi/dutch-summary (text-or-url)
"Obtain a Dutch summary for the given TEXT-OR-URL."
(let ((kagi-summarize-default-language "NL"))
(kagi-summarize text-or-url)))
#+end_src
2024-01-14 09:05:07 +00:00
Note that, when you invoke the summarizer functionality interactively, you can also temporarily choose a different target language with the universal prefix (=C-u=) on one of the =kagi-summarize-*= commands.
*** Caching override
2023-12-29 22:16:06 +00:00
The [[https://help.kagi.com/kagi/api/summarizer.html][Summarizer API]] comes with the following note:
#+begin_quote
For handling sensitive information and documents, we recommend setting the 'cache' API parameter to False. In this way, the document will "flow through" our infrastructure and will not be retained anywhere after processing.
#+end_quote
In a similar fashion as above, you could define a function that disables caching temporarily (while having it enabled by default).
#+begin_src elisp
(defun my/kagi/sensitive-summary (text)
"Summarize the current TEXT with caching disabled.")
(let ((kagi-summarizer-cache nil))
(kagi-summarize text))
#+end_src
** Embark integration
The kagi.el package can be integrated with [[https://github.com/oantolin/embark][Embark]], to easily summarize a buffer, region or an URL. In order to be consistent with all keymaps, and to avoid clashes, the functionality is behind the /K/ prefix key. Press /K s/ to trigger the summarize functionality.
Add the following to your configuration to trigger summary functionality with key /K s/:
#+begin_src elisp
(defmacro embark-kagi-map (name function)
"Macro for defining a keymap for accessing Kagi functionality through Embark."
`(defvar-keymap ,name
:doc "Keymap for accessing Kagi functionality with Embark."
:parent nil
"s" #',function))
(embark-kagi-map embark-kagi-buffer-map kagi-summarize-buffer)
(keymap-set embark-buffer-map "K" embark-kagi-buffer-map)
(embark-kagi-map embark-kagi-region-map kagi-summarize-region)
(keymap-set embark-region-map "K" embark-kagi-region-map)
(embark-kagi-map embark-kagi-url-map kagi-summarize-url)
(keymap-set embark-url-map "K" embark-kagi-url-map)
#+end_src
2024-01-12 13:59:16 +00:00
** Key bindings
Since the FastGPT shell inherits from =comint-mode= indirectly, many key bindings are also inherited. Enter the =help= command in the shell to get more info, or run =describe-keymap= on =fastgpt-shell-mode-map=.
One of those bindings is =C-c C-o=, which flushes the last output. However, this binding is used in =org-mode= to open a URL an point. Typical FastGPT results include URLs so one may be tempted to type =C-c C-o= to browse the URL, only to have the output erased.
2024-01-12 13:59:16 +00:00
If you recognize this confusion, you may want to add the following line to your configuration file to shadow the =comint-mode= binding with something more appropriate:
#+begin_src elisp
(add-hook 'fastgpt-shell-mode-hook
(lambda ()
(keymap-set fastgpt-shell-mode-map "C-c C-o" #'browse-url-at-point)))
2024-01-12 13:59:16 +00:00
#+end_src
Because the =fastgpt-shell-mode-map= only becomes available when =kagi-fastgpt-shell= has been invoked, the keybinding is done in a mode hook.
* Changelog
2024-02-03 07:44:49 +00:00
** 0.4pre
2024-02-09 19:50:50 +00:00
*** New
2024-02-03 07:44:49 +00:00
- Introduce variable =kagi-summarizer-default-summary-format=, to produce a paragraph summary (default) or a take-away in bullet-list format.
2024-02-09 19:50:50 +00:00
- =kagi-proofread= asks FastGPT to proofread the region, a buffer or a text input.
*** Fixes
- Change the prompt for =kagi-translate= to return translations only, without preamble.
- Added autoload markers where they were missing.
2024-02-03 06:05:12 +00:00
** 0.3.1
*** Fixes
- Fix for displaying a summary in a new buffer.
- Fix for =kagi-summarize-region= that doesn't need to ask for insert at point.
2024-02-02 20:06:57 +00:00
** 0.3
2024-01-14 09:05:07 +00:00
*** New
2024-01-25 11:14:36 +00:00
- The summarizer commands =kagi-summarize-*= now accept a universal prefix. This allows you to:
- insert the summary at point (instead of a separate buffer);
- choose a different target language;
- choose a different summarizer engine.
2024-01-14 09:05:07 +00:00
2024-02-02 20:06:57 +00:00
- =kagi-translate= translates texts or complete buffers to another language (including programming languages).
2024-01-14 09:05:07 +00:00
2024-01-18 19:39:50 +00:00
*** Fixes
- Fixed language code for Korean summaries.
2024-01-25 11:14:36 +00:00
- **text** is converted to the =kagi-bold= face.
- $text$ is converted to the new =kagi-italic= face.
2024-01-18 19:39:50 +00:00
2024-01-14 07:04:29 +00:00
** 0.2
*** Breaking changes
- Some variables were renamed for consistency. The impact is considered low given the infancy of the package, and API URLs are typically not modified anyway.
| Old name | New name |
|---------------------------------+------------------------------------|
| =kagi-api-fastgpt-url= | =kagi-fastgpt-api-url= |
| =kagi-api-summarizer-url= | =kagi-summarizer-api-url= |
| =kagi-summarize-default-language= | =kagi-summarizer-default-language= |
*** Fixes
2024-01-13 09:15:03 +00:00
- Better error handling for the summarizer
- Fix bug when the summarizer input contains a URL ({{{issue(2)}}})
- Check that the summarizer input is at least 50 words ({{{issue(2)}}})
2024-01-14 07:04:29 +00:00
*** Misc
- Add boolean variable =kagi-stubbed-responses= to enable stubbed responses, to replace actual API calls. Since calls are metered, it's more economic to use stubbed responses for development / debugging purposes.
** 0.1
Initial release.
* References
2023-12-25 11:40:57 +00:00
- [[https://help.kagi.com/kagi/api/fastgpt.html][Kagi FastGPT API]]
- [[https://help.kagi.com/kagi/api/summarizer.html][Kagi Universal Summarizer API]]
2023-12-25 11:40:57 +00:00
- [[https://github.com/xenodium/chatgpt-shell][xenodium's chatgpt-shell]], which also provides shell-maker required by the FastGPT shell.