This commit is contained in:
2025-10-19 22:16:22 +08:00
parent 48f26adf81
commit e1b3fe7244
3 changed files with 431 additions and 12 deletions
+166 -12
View File
@@ -1,17 +1,171 @@
;;; ai.el -*- lexical-binding: t; -*-
(setq gptel-model 'google/gemini-2.5-flash ;; Default model
gptel-backend
(gptel-make-openai "OpenRouter" ;Any name you want
:host "openrouter.ai"
:endpoint "/api/v1/chat/completions"
:stream t
:key "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" ;can be a function that returns the key
:models '(google/gemini-2.5-flash
google/gemini-2.5-pro
anthropic/claude-sonnet-4
anthropic/claude-sonnet-4.5
)))
;;; ============================================================================
;;; gptel Configuration
;;; ============================================================================
;; Core gptel setup
(use-package! gptel
:config
;; Default backend: OpenRouter
(setq gptel-model 'google/gemini-2.5-flash
gptel-backend
(gptel-make-openai "OpenRouter"
:host "openrouter.ai"
:endpoint "/api/v1/chat/completions"
:stream t
:key "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"
:models '(google/gemini-2.5-flash
google/gemini-2.5-pro
anthropic/claude-sonnet-4
anthropic/claude-sonnet-4.5)))
;; Use org-mode by default for better note-taking
(setq gptel-default-mode 'org-mode)
;; Move cursor to end of response automatically
(add-hook 'gptel-post-response-functions 'gptel-end-of-response)
;; Keybindings
(map! :leader
(:prefix ("a" . "AI")
:desc "gptel chat" "g" #'gptel
:desc "gptel send" "s" #'gptel-send
:desc "gptel menu" "m" #'gptel-menu
:desc "gptel rewrite" "r" #'gptel-rewrite
:desc "Add context" "c" #'gptel-add
:desc "Add file to context" "f" #'gptel-add-file))
;; Additional keybindings in gptel buffer
(map! :map gptel-mode-map
"C-c RET" #'gptel-send
"C-c C-k" #'gptel-abort
"C-c C-c" #'gptel-menu))
;; gptel presets for different tasks
(after! gptel
;; Coding assistant preset
(gptel-make-preset 'coder
:description "Expert coding assistant"
:backend "OpenRouter"
:model 'anthropic/claude-sonnet-4.5
:system "You are an expert coding assistant. Provide high-quality code solutions, refactorings, and explanations. Be concise but thorough. Include error handling and follow best practices.")
;; Code explainer preset
(gptel-make-preset 'explain
:description "Explain code to beginners"
:system "Explain this code to a novice programmer. Use simple language and break down complex concepts.")
;; Refactoring preset
(gptel-make-preset 'refactor
:description "Code refactoring expert"
:model 'anthropic/claude-sonnet-4.5
:system "You are a code refactoring expert. Improve code quality, readability, and performance while maintaining functionality. Explain your changes.")
;; Quick answers preset
(gptel-make-preset 'quick
:description "Quick, concise answers"
:model 'google/gemini-2.5-flash
:system "Provide quick, concise answers. Be direct and to the point.")
;; Documentation writer preset
(gptel-make-preset 'docs
:description "Documentation writer"
:system "Write clear, comprehensive documentation. Include examples and explain edge cases."))
;;; ============================================================================
;;; gptel-quick - Quick lookups and explanations
;;; ============================================================================
(use-package! gptel-quick
:after gptel
:config
;; Include context from gptel-add if available
(setq gptel-quick-use-context t)
(map! :leader
(:prefix "a"
:desc "Quick lookup" "q" #'gptel-quick)))
;;; ============================================================================
;;; gptel-extensions - Extra utility functions
;;; ============================================================================
(use-package! gptel-extensions
:after gptel
:config
(map! :leader
(:prefix "a"
:desc "Load buffer into session" "l" #'gptel-extensions-load-buffer
:desc "Send whole buffer" "b" #'gptel-extensions-send-whole-buffer
:desc "Refactor region" "R" #'gptel-extensions-refactor)))
;;; ============================================================================
;;; gptel-autocomplete - Inline code completion
;;; ============================================================================
(use-package! gptel-autocomplete
:after gptel
:config
;; Enable in programming modes
(add-hook 'prog-mode-hook #'gptel-autocomplete-mode)
;; Configure keybindings for autocomplete
(map! :map gptel-autocomplete-mode-map
"M-TAB" #'gptel-autocomplete-complete
"C-c TAB" #'gptel-autocomplete-complete)
;; Optional: Configure which model to use for completion
;; (setq gptel-autocomplete-model 'google/gemini-2.5-flash)
)
;;; ============================================================================
;;; Optional: Add Ollama for local models (commented out by default)
;;; ============================================================================
;; Uncomment to add Ollama support for local models
;; (after! gptel
;; (gptel-make-ollama "Ollama"
;; :host "localhost:11434"
;; :stream t
;; :models '(qwen2.5-coder:latest
;; mistral:latest
;; llama3.2:latest)))
;; To make Ollama default, uncomment:
;; (setq gptel-model 'qwen2.5-coder:latest
;; gptel-backend (gptel-make-ollama "Ollama"
;; :host "localhost:11434"
;; :stream t
;; :models '(qwen2.5-coder:latest
;; mistral:latest)))
;;; ============================================================================
;;; Helper functions
;;; ============================================================================
(defun my/gptel-quick-explain-region ()
"Quickly explain selected code region."
(interactive)
(when (use-region-p)
(let ((code (buffer-substring-no-properties (region-beginning) (region-end))))
(gptel-request code
:system "Explain this code concisely in 2-3 sentences."
:callback (lambda (response info)
(message "Explanation: %s" response))))))
(defun my/gptel-proofread-region ()
"Proofread and improve selected text."
(interactive)
(when (use-region-p)
(gptel-rewrite-region (region-beginning) (region-end)
"Fix spelling, grammar, and improve clarity. Keep the same tone and style.")))
;; Add keybindings for helper functions
(map! :leader
(:prefix "a"
:desc "Quick explain" "e" #'my/gptel-quick-explain-region
:desc "Proofread text" "p" #'my/gptel-proofread-region))
;;; Claude Code Configuration