EmacsでLLMを使う: gptel

[2025-04-16] gptelがgpt-4.1に対応したので一部削除しました。

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)
  (setq gptel-model 'gemma3:27b-it-q8_0)
  (setq gptel-backend
	(gptel-make-ollama "Ollama"
	  :host "localhost:11434"
	  :models '(gemma3:27b-it-q8_0)
	  :stream t))
  (setq gptel-temperature 0)
  (setq gptel-max-tokens 8192) ; max response tokens
  (setq gptel--system-message nil))

M-x gptel-menu でメニューが出る。メニューにあるように -m でモデルが選択できる。

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

もう一つの方法として、M-x gptel でチャット専用バッファを出して、そこで会話する。送信は C-c RET である。