瀏覽代碼

Add gptel and elysium

master
Bingen Eguzkitza 2 週之前
父節點
當前提交
aee616962f
共有 3 個檔案被更改,包括 146 行新增 和 0 行删除
  1. +3
    -0
      init.el
  2. +21
    -0
      lisp/init-elysium.el
  3. +122
    -0
      lisp/init-gptel.el

+ 3
- 0
init.el 查看文件

@@ -102,6 +102,9 @@
(require 'init-latex)
(require 'init-mu4e)
(require 'init-literate-calc)
;; AI
(require 'init-gptel)
(require 'init-elysium)

(when *spell-check-support-enabled*
(require 'init-spelling))

+ 21
- 0
lisp/init-elysium.el 查看文件

@@ -0,0 +1,21 @@
;;; package --- elysium
;;; Commentary:
;;; https://github.com/lanceberge/elysium
;;; Code:

;; Elysium applies AI-generated code changes to the buffer as
;; smerge-style hunks. It queries LLMs through gptel, so the
;; backend and model are those from init-gptel.el (OpenRouter by
;; default, Venice also available).

(use-package elysium
:ensure t
:defer t
:custom
;; Below are the default values
(elysium-window-size 0.33) ; The elysium buffer will be 1/3 your screen
(elysium-window-style 'vertical)) ; Can be customized to horizontal

(provide 'init-elysium)

;;; init-elysium.el ends here

+ 122
- 0
lisp/init-gptel.el 查看文件

@@ -0,0 +1,122 @@
;;; package --- gptel
;;; Commentary:
;;; A simple LLM client for Emacs.
;;; https://github.com/karthink/gptel
;;; Code:

(use-package gptel
:ensure t
:defer t
:config
;; Major mode used for chat buffers: 'org-mode or 'markdown-mode.
(setq gptel-default-mode 'org-mode)

;; API keys: each backend below uses #'gptel-api-key-from-auth-source,
;; which looks up the backend's host with login "apikey" in auth-source.
;; Add these lines to ~/.authinfo.gpg:
;;
;; machine openrouter.ai login apikey password <OPENROUTER-KEY>
;; machine api.venice.ai login apikey password <VENICE-KEY>
;;
;; (Create keys at https://openrouter.ai/keys and
;; https://venice.ai/settings/api-key respectively.)
;;
;; Note: OpenCode cannot be used as a gptel backend: its HTTP API is
;; for driving agent sessions, not an OpenAI-compatible LLM endpoint,
;; and its own provider authenticates with an account, not an API key.

;; OpenRouter (default backend): OpenAI-compatible gateway to many
;; providers. Model IDs can be browsed at https://openrouter.ai/models
(setq gptel-backend
(gptel-make-openai "OpenRouter"
:host "openrouter.ai"
:endpoint "/api/v1/chat/completions"
:key #'gptel-api-key-from-auth-source
:stream t
:models '(anthropic/claude-sonnet-5.5
anthropic/claude-haiku-5.5
openai/gpt-6.1-sol
google/gemini-4-argon
z-ai/glm-5.3-prime
z-ai/glm-5.3-flashx
z-ai/glm-5.3-flash
z-ai/glm-5.2
deepseek/deepseek-v4.1-flash
qwen/qwen3.8-max-prime
x-ai/grok-4.7
moonshotai/kimi-k3.1-pro))
;; Change the default model here, or per-session with the menu
;; (C-u C-c RET in a gptel buffer, then -m).
gptel-model 'z-ai/glm-5.3-prime)

;; Venice (https://venice.ai): privacy-oriented, OpenAI-compatible
;; API with uncensored models. Registered but not the default: pick
;; it per-session with `M-x gptel-venice' (below) or the menu
;; (C-u C-c RET, then -m), or make it the default:
;;
;; (setq gptel-backend (gptel-get-backend "Venice")
;; gptel-model 'zai-org-glm-5)
(gptel-make-openai "Venice"
:host "api.venice.ai"
:endpoint "/api/v1/chat/completions"
:key #'gptel-api-key-from-auth-source
:stream t
:models '(zai-org-glm-5 ;Venice's default model
z-ai-glm-5-3
z-ai-glm-5-3-flash
venice-uncensored-1-2
claude-sonnet-5-5
claude-opus-5-5
deepseek-v4-1-flash
kimi-k3-1-pro))

;; In org chat buffers, only send the current heading's tree as
;; context instead of the whole buffer:
;;
;; (setq gptel-org-branching-context t)
)

;; Start or switch to a chat on a specific backend, without touching
;; the global default. An existing chat buffer keeps its chosen
;; model; a new chat gets MODEL.
(defun gptel--backend-chat (backend-name model)
"Start or switch to a gptel chat using BACKEND-NAME and MODEL.
The global default backend is not changed."
(let* ((backend (gptel-get-backend backend-name))
(buffer (gptel (concat "*" backend-name "*"))))
(with-current-buffer buffer
(setq-local gptel-backend backend)
(unless (memq gptel-model (gptel-backend-models backend))
(setq-local gptel-model model)))
(display-buffer buffer gptel-display-buffer-action)
buffer))

(defun gptel-openrouter ()
"Start or switch to a gptel chat using OpenRouter."
(interactive)
(require 'gptel) ;deferred by use-package above
(gptel--backend-chat "OpenRouter" 'z-ai/glm-5.3-prime))

(defun gptel-venice ()
"Start or switch to a gptel chat using Venice."
(interactive)
(require 'gptel)
(gptel--backend-chat "Venice" 'zai-org-glm-5))

;; Usage:
;; M-x gptel start a dedicated chat buffer (default backend)
;; M-x gptel-openrouter start or switch to a chat on OpenRouter
;; M-x gptel-venice start or switch to a chat on Venice
;; M-x gptel-send send the region (or text up to point) from any buffer
;; M-x gptel-rewrite rewrite/refactor the selected region
;; C-c RET send the query
;; C-u C-c RET menu: switch backend/model with -m, etc.
;;
;; Uncomment for global shortcuts:
;; (global-set-key (kbd "C-c g") #'gptel)
;; (global-set-key (kbd "C-c o") #'gptel-openrouter)
;; (global-set-key (kbd "C-c v") #'gptel-venice)

(provide 'init-gptel)

;;; init-gptel.el ends here

Loading…
取消
儲存