158 lines
6.0 KiB
EmacsLisp
158 lines
6.0 KiB
EmacsLisp
;;; init-ai.el --- Configuración de inteligencias artificales -*- lexical-binding: t -*-
|
|
|
|
;; Author: kj <webmaster@outcontrol.net>
|
|
;; URL: https://git.kj2.me/kj/confi-emacs-actual
|
|
|
|
;;; Commentary:
|
|
|
|
;; Configuración para Inteligencia artifical en Emacs.
|
|
|
|
;;; Code:
|
|
|
|
;; Cliente LLM (ollama, chatgpt, gemini, etc.)
|
|
(use-package gptel
|
|
:defer nil
|
|
:config
|
|
(when (getenv "GEMINI_KEY")
|
|
(setq gptel-backend (gptel-make-gemini "Gemini"
|
|
:key (getenv "GEMINI_KEY")
|
|
:stream t)))
|
|
|
|
(setq gptel-backend (gptel-make-openai "llama.cpp"
|
|
:stream t
|
|
:protocol "http"
|
|
:host "127.0.0.1:1945"
|
|
:models '("Qwen2.5-Coder"
|
|
"Qwen3.5-0.8B"
|
|
"Qwen3.5-4B"
|
|
"Qwen3.5-9B"
|
|
"Qwen3.6-27B"
|
|
"Qwen3Coder-Q2"
|
|
"Qwen3Coder"
|
|
"QwenSeek-2B"
|
|
"gemma-4-12B"
|
|
"gemma-4-26B-Q2"
|
|
"gemma-4-26B"
|
|
"gemma-4-31B-Q2"
|
|
"gemma-4-31B"
|
|
"gemma-4-E2B"
|
|
"gemma-4-E4B-UNCENSORED"
|
|
"gemma-4-E4B"
|
|
"gptoss-20b")))
|
|
|
|
(setq gptel-model 'gemma4:31b-cloud
|
|
gptel-backend (gptel-make-ollama "Ollama"
|
|
:host "localhost:11434"
|
|
:stream t
|
|
:request-params '(:think :json-false)
|
|
:models '("gemma4:31b-cloud"
|
|
"glm-5.1:cloud"
|
|
"kimi-k2.6:cloud"
|
|
"gpt-oss:20b-cloud"
|
|
"minimax-m2.5:cloud"
|
|
"qwen3-coder-next:cloud")))
|
|
|
|
;; Backend opencode-go: suscripción OpenCode Go vía endpoint OpenAI-compatible
|
|
(defun kj-opencode-go-key ()
|
|
"Return the OpenCode Go API key from opencode's auth file."
|
|
(let ((auth (with-temp-buffer
|
|
(insert-file-contents "~/.local/share/opencode/auth.json")
|
|
(json-parse-buffer :object-type 'alist))))
|
|
(alist-get 'key (alist-get 'opencode-go auth))))
|
|
|
|
(gptel-make-openai "OpenCode Go"
|
|
:host "opencode.ai"
|
|
:endpoint "/zen/go/v1/chat/completions"
|
|
:key #'kj-opencode-go-key
|
|
:stream t
|
|
:models '(minimax-m3 minimax-m2.7 minimax-m2.5
|
|
kimi-k3 kimi-k2.7-code kimi-k2.6 kimi-k2.5
|
|
glm-5.2 glm-5.1 glm-5
|
|
deepseek-v4-pro deepseek-v4-flash
|
|
qwen3.7-max qwen3.8-max qwen3.7-plus qwen3.6-plus qwen3.5-plus
|
|
mimo-v2-pro mimo-v2-omni mimo-v2.5-pro mimo-v2.5
|
|
hy3 hy3-preview
|
|
gpt-5.6-luna grok-4.5))
|
|
|
|
;; Modelos gratuitos de OpenCode Go, servidos vía el endpoint /zen/v1
|
|
(gptel-make-openai "OpenCode Free"
|
|
:host "opencode.ai"
|
|
:endpoint "/zen/v1/chat/completions"
|
|
:key #'kj-opencode-go-key
|
|
:stream t
|
|
:models '(big-pickle longcat-2.0-free deepseek-v4-flash-free mimo-v2.5-free
|
|
north-mini-code-free nemotron-3-ultra-free
|
|
ling-3.0-flash-free laguna-s-2.1-free))
|
|
|
|
(setq gptel-default-mode 'markdown-mode
|
|
gptel-prompt-prefix-alist
|
|
'((markdown-mode . "# User\n\n")
|
|
(org-mode . "* User\n\n")
|
|
(text-mode . "# User\n\n"))
|
|
gptel-response-prefix-alist
|
|
'((markdown-mode . "# AI\n\n")
|
|
(org-mode . "* AI\n\n")
|
|
(text-mode . "# AI\n\n"))
|
|
gptel-directives
|
|
'((default . "You are a large language model living in Emacs and a helpful assistant. Respond concisely in Spanish."))
|
|
)
|
|
|
|
(add-hook 'gptel-post-response-functions 'gptel-end-of-response)
|
|
(setopt gptel-include-reasoning nil) ;; Mantener hasta resolver: https://github.com/ragnard/gptel-magit/issues/8
|
|
|
|
(defun gptel-switch+model ()
|
|
"Switch to gptel backend and model in a single completion prompt."
|
|
(interactive)
|
|
(let (choices)
|
|
(dolist (pair gptel--known-backends)
|
|
(let* ((backend-name (car pair))
|
|
(backend (cdr pair))
|
|
(models
|
|
(and (fboundp 'gptel-backend-models)
|
|
(gptel-backend-models backend))))
|
|
(when models
|
|
(dolist (model models)
|
|
(push (cons ; (format "%s:%s" backend-name model)
|
|
(format "%s → %s"
|
|
(propertize backend-name 'face 'font-lock-keyword-face)
|
|
(propertize (symbol-name model) 'face 'font-lock-function-name-face))
|
|
(cons backend-name model))
|
|
choices)))))
|
|
(let* ((choice
|
|
(completing-read "Model: " (mapcar #'car choices) nil t))
|
|
(sel (cdr (assoc choice choices))))
|
|
(setq gptel-backend (cdr (assoc (car sel) gptel--known-backends))
|
|
gptel-model (cdr sel))
|
|
(message "gptel set to %s:%s" (car sel) (cdr sel)))))
|
|
)
|
|
|
|
;; (use-package copilot
|
|
;; :hook (prog-mode . copilot-mode)
|
|
;; :bind (:map copilot-completion-map
|
|
;; ("C-g" . 'copilot-clear-overlay)
|
|
;; ("C-<return>" . 'copilot-accept-completion)
|
|
;; ("S-<return>" . 'copilot-accept-completion-by-word)))
|
|
|
|
(use-package gptel-magit
|
|
:ensure t
|
|
:hook (magit-mode . gptel-magit-install))
|
|
|
|
(use-package gptel-autocomplete
|
|
:defer nil
|
|
:ensure (:host github :repo "JDNdeveloper/gptel-autocomplete")
|
|
:bind (("M-<return>" . gptel-complete)
|
|
:map gptel-autocomplete-completion-map
|
|
("C-<return>" . gptel-accept-completion)))
|
|
|
|
(use-package gptel-agent
|
|
:ensure t
|
|
:config (gptel-agent-update))
|
|
|
|
(use-package macher
|
|
:ensure (:host github :repo "kmontag/macher")
|
|
:custom
|
|
(macher-action-buffer-ui 'org))
|
|
|
|
(provide 'init-ai)
|
|
;;; init-ai.el ends here
|