Emacs personal configuration
Ви не можете вибрати більше 25 тем Теми мають розпочинатися з літери або цифри, можуть містити дефіси (-) і не повинні перевищувати 35 символів.

123 lines
5.0KB

  1. ;;; package --- gptel
  2. ;;; Commentary:
  3. ;;; A simple LLM client for Emacs.
  4. ;;; https://github.com/karthink/gptel
  5. ;;; Code:
  6. (use-package gptel
  7. :ensure t
  8. :defer t
  9. :config
  10. ;; Major mode used for chat buffers: 'org-mode or 'markdown-mode.
  11. (setq gptel-default-mode 'org-mode)
  12. ;; API keys: each backend below uses #'gptel-api-key-from-auth-source,
  13. ;; which looks up the backend's host with login "apikey" in auth-source.
  14. ;; Add these lines to ~/.authinfo.gpg:
  15. ;;
  16. ;; machine openrouter.ai login apikey password <OPENROUTER-KEY>
  17. ;; machine api.venice.ai login apikey password <VENICE-KEY>
  18. ;;
  19. ;; (Create keys at https://openrouter.ai/keys and
  20. ;; https://venice.ai/settings/api-key respectively.)
  21. ;;
  22. ;; Note: OpenCode cannot be used as a gptel backend: its HTTP API is
  23. ;; for driving agent sessions, not an OpenAI-compatible LLM endpoint,
  24. ;; and its own provider authenticates with an account, not an API key.
  25. ;; OpenRouter (default backend): OpenAI-compatible gateway to many
  26. ;; providers. Model IDs can be browsed at https://openrouter.ai/models
  27. (setq gptel-backend
  28. (gptel-make-openai "OpenRouter"
  29. :host "openrouter.ai"
  30. :endpoint "/api/v1/chat/completions"
  31. :key #'gptel-api-key-from-auth-source
  32. :stream t
  33. :models '(anthropic/claude-sonnet-5.5
  34. anthropic/claude-haiku-5.5
  35. openai/gpt-6.1-sol
  36. google/gemini-4-argon
  37. z-ai/glm-5.3-prime
  38. z-ai/glm-5.3-flashx
  39. z-ai/glm-5.3-flash
  40. z-ai/glm-5.2
  41. deepseek/deepseek-v4.1-flash
  42. qwen/qwen3.8-max-prime
  43. x-ai/grok-4.7
  44. moonshotai/kimi-k3.1-pro))
  45. ;; Change the default model here, or per-session with the menu
  46. ;; (C-u C-c RET in a gptel buffer, then -m).
  47. gptel-model 'z-ai/glm-5.3-prime)
  48. ;; Venice (https://venice.ai): privacy-oriented, OpenAI-compatible
  49. ;; API with uncensored models. Registered but not the default: pick
  50. ;; it per-session with `M-x gptel-venice' (below) or the menu
  51. ;; (C-u C-c RET, then -m), or make it the default:
  52. ;;
  53. ;; (setq gptel-backend (gptel-get-backend "Venice")
  54. ;; gptel-model 'zai-org-glm-5)
  55. (gptel-make-openai "Venice"
  56. :host "api.venice.ai"
  57. :endpoint "/api/v1/chat/completions"
  58. :key #'gptel-api-key-from-auth-source
  59. :stream t
  60. :models '(zai-org-glm-5 ;Venice's default model
  61. z-ai-glm-5-3
  62. z-ai-glm-5-3-flash
  63. venice-uncensored-1-2
  64. claude-sonnet-5-5
  65. claude-opus-5-5
  66. deepseek-v4-1-flash
  67. kimi-k3-1-pro))
  68. ;; In org chat buffers, only send the current heading's tree as
  69. ;; context instead of the whole buffer:
  70. ;;
  71. ;; (setq gptel-org-branching-context t)
  72. )
  73. ;; Start or switch to a chat on a specific backend, without touching
  74. ;; the global default. An existing chat buffer keeps its chosen
  75. ;; model; a new chat gets MODEL.
  76. (defun gptel--backend-chat (backend-name model)
  77. "Start or switch to a gptel chat using BACKEND-NAME and MODEL.
  78. The global default backend is not changed."
  79. (let* ((backend (gptel-get-backend backend-name))
  80. (buffer (gptel (concat "*" backend-name "*"))))
  81. (with-current-buffer buffer
  82. (setq-local gptel-backend backend)
  83. (unless (memq gptel-model (gptel-backend-models backend))
  84. (setq-local gptel-model model)))
  85. (display-buffer buffer gptel-display-buffer-action)
  86. buffer))
  87. (defun gptel-openrouter ()
  88. "Start or switch to a gptel chat using OpenRouter."
  89. (interactive)
  90. (require 'gptel) ;deferred by use-package above
  91. (gptel--backend-chat "OpenRouter" 'z-ai/glm-5.3-prime))
  92. (defun gptel-venice ()
  93. "Start or switch to a gptel chat using Venice."
  94. (interactive)
  95. (require 'gptel)
  96. (gptel--backend-chat "Venice" 'zai-org-glm-5))
  97. ;; Usage:
  98. ;; M-x gptel start a dedicated chat buffer (default backend)
  99. ;; M-x gptel-openrouter start or switch to a chat on OpenRouter
  100. ;; M-x gptel-venice start or switch to a chat on Venice
  101. ;; M-x gptel-send send the region (or text up to point) from any buffer
  102. ;; M-x gptel-rewrite rewrite/refactor the selected region
  103. ;; C-c RET send the query
  104. ;; C-u C-c RET menu: switch backend/model with -m, etc.
  105. ;;
  106. ;; Uncomment for global shortcuts:
  107. ;; (global-set-key (kbd "C-c g") #'gptel)
  108. ;; (global-set-key (kbd "C-c o") #'gptel-openrouter)
  109. ;; (global-set-key (kbd "C-c v") #'gptel-venice)
  110. (provide 'init-gptel)
  111. ;;; init-gptel.el ends here