EmacsでLLMを使う: gptel

EmacsでLLMを使う: chatgpt-shell の続編として、gptel を試してみた。

インストールはやはり melpa でできる。念のため説明すると、~/.emacs.d/init.el に

(require 'package)
(add-to-list 'package-archives '("melpa" . "https://melpa.org/packages/") t)
(package-initialize)

と書いておいて、M-x package-list-packages で gptel の上で I を打ち、x でインストールを実行する。ついでに markdown-mode も入ってなければ入れておく。アップデートは、ときどき M-x package-list-packages してみて、アップデートの知らせがあれば U を打ち、x で実行する。

インストールできたら ~/.emacs.d/init.el に例えば次を書き加える。ただしOpenAIのAPIキーが環境変数 OPENAI_API_KEY に設定されているとする。

(use-package gptel
  :ensure t
  :config
  (setq gptel-api-key (getenv "OPENAI_API_KEY")))

次はもっと複雑な例で、まだgptelに登録されていないgpt-4.1を含むいくつかのモデルをメニューに加え、ローカルで動いているOllamaのモデルをデフォルトにする:

(use-package gptel
  :ensure t
  :config
  (setq gptel-api-key (getenv "OPENAI_API_KEY"))
  ;; (gptel-make-openai "OpenAI"
  ;;   :key (getenv "OPENAI_API_KEY")
  ;;   :models '(gpt-4.1)
  ;;   :stream t)
  (gptel-make-anthropic "Claude"
    :key (getenv "ANTHROPIC_API_KEY")
    :models '(claude-3-7-sonnet-20250219)
    :stream t)
  (gptel-make-gemini "Gemini"
    :key (getenv "GOOGLE_API_KEY")
    :models '(gemini-2.5-pro-preview-03-25)
    :stream t)
  (gptel-make-ollama "Qwen"
    :host "localhost:11434"
    :models '(qwen3:32b-q8_0)
    :request-params '(:options (:num_ctx 32768))
    :stream t)
  (gptel-make-ollama "Llama4"
    :host "localhost:11434"
    :models '(llama4:scout)
    :request-params '(:options (:num_ctx 1000000)) ; max 10485760
    :stream t)
  (setq gptel-model 'gemma3:27b-it-q8_0)
  (setq gptel-backend ; https://github.com/karthink/gptel/issues/330
        (gptel-make-ollama "Ollama"
          :host "localhost:11434"
          :models '(gemma3:27b-it-q8_0)
          :request-params '(:options (:num_ctx 131072) :keep_alive 86400)
          :stream t))
  (setq gptel-temperature 0) ; default: 1.0
  ;; (setq gptel-max-tokens 8192) ; max response tokens, default: nil
  (setq gptel--system-message nil))

使い方は2通りある。一つは、M-x gptel でチャット専用バッファを出して、そこで会話する。送信は C-c RET (C-c C-m) である。

もう一つは、任意のバッファで M-x gptel-send する。バッファの先頭からカーソル位置までがプロンプトになる。カーソル位置から返答が表示されるので、その後にさらに質問を書けば、さらにその後に答えが返る。過去のやりとりを編集することもできる。バッファの一部分だけをプロンプトにしたい場合は、範囲(リージョン)を指定してから M-x gptel-send する。

モデルを変更したいときは、M-x gptel-menu でメニューを出す。-m でモデルが選択できる。