ollama fill-in-middle completion
This commit is contained in:
parent
fd1f1033fa
commit
b295550143
97
init.org
97
init.org
|
@ -1355,6 +1355,103 @@ Enable =hs-minor-mode= in =prog-mode= to allow for folding away comments and mod
|
|||
)
|
||||
#+end_src
|
||||
|
||||
** Copilot 😭
|
||||
I feel so bad for this.. but its not awful..
|
||||
|
||||
#+begin_src emacs-lisp
|
||||
(use-package plz
|
||||
:straight t)
|
||||
|
||||
(require 'ollama-complete)
|
||||
#+end_src
|
||||
|
||||
#+begin_src emacs-lisp :tangle "local-lisp/ollama-complete.el"
|
||||
(defgroup ollama-complete nil "Ollama Code Completion." :group 'completion)
|
||||
|
||||
(require 'plz)
|
||||
|
||||
(defcustom ollama-complete-host "http://localhost:11434"
|
||||
"URL of local ollama service."
|
||||
:type 'url)
|
||||
|
||||
(defcustom ollama-complete-model "qwen2.5-coder:3b-instruct-q4_K_M"
|
||||
"Model to use for Fill-in-Middle completion.")
|
||||
|
||||
(defvar ollama-complete--options
|
||||
'(("temperature" . 0) ("top_p" . 0.5) ("num_predict" . 30)))
|
||||
|
||||
(defvar ollama-complete--overlay nil)
|
||||
|
||||
(defvar ollama-complete--overlay-buffer nil
|
||||
"Buffer in which the overlay is placed.")
|
||||
|
||||
(defun ollama-complete--fill-in-middle ()
|
||||
"Ask ollama to generate response for fill-in-middle prompt."
|
||||
(interactive)
|
||||
(let ((prompt
|
||||
(concat
|
||||
"<|fim_prefix|>"
|
||||
(concat
|
||||
(buffer-substring-no-properties (point-min) (point))
|
||||
(concat
|
||||
"<|fim_suffix|>"
|
||||
(concat
|
||||
(buffer-substring-no-properties (point) (point-max))
|
||||
"<|fim_middle|>"))))))
|
||||
(setq ollama-complete--overlay-buffer (current-buffer))
|
||||
(message "overlay-buffer: %s" ollama-complete--overlay-buffer)
|
||||
(plz 'post
|
||||
(concat ollama-complete-host "/api/generate")
|
||||
:body (json-encode `(("model" . "qwen2.5-coder:3b-instruct-q4_K_M")
|
||||
("raw" . t)
|
||||
("stream" . :json-false)
|
||||
("options" . ,ollama-complete--options)
|
||||
("prompt" . ,prompt)
|
||||
))
|
||||
:as #'json-read
|
||||
:then (lambda (alist)
|
||||
(message "Ollama: FIM Completion: %s" (alist-get 'response alist))
|
||||
(ollama-complete--make-overlay (alist-get 'response alist))))
|
||||
)
|
||||
)
|
||||
|
||||
(defun ollama-complete--make-overlay (string)
|
||||
"make overlay showign STRING at POS, or move existing overlay there."
|
||||
(interactive)
|
||||
(if ollama-complete--overlay-buffer
|
||||
(with-current-buffer ollama-complete--overlay-buffer
|
||||
(message "make-overlay %d \"%s\" %s" (point) string ollama-complete--overlay-buffer)
|
||||
(if ollama-complete--overlay
|
||||
(move-overlay ollama-complete--overlay (point) (point) ollama-complete--overlay-buffer)
|
||||
(setq ollama-complete--overlay (make-overlay (point) (point) ollama-complete--overlay-buffer))
|
||||
(overlay-put ollama-complete--overlay 'window (selected-window))
|
||||
(overlay-put ollama-complete--overlay
|
||||
'after-string (propertize string 'face 'font-lock-comment-face))
|
||||
(add-text-properties 0 1 '(cursor 1) string)
|
||||
ollama-complete--overlay)))
|
||||
)
|
||||
|
||||
(defun ollama-complete--hide-overlay ()
|
||||
"Hide temporary completion candidate overlay."
|
||||
(interactive)
|
||||
(when ollama-complete--overlay
|
||||
(delete-overlay ollama-complete--overlay)
|
||||
(setq ollama-complete--overlay nil)
|
||||
(setq ollama-complete--overlay-buffer nil))
|
||||
)
|
||||
|
||||
(defun ollama-complete--insert-completion ()
|
||||
"Hide temporary completion candidate overlay."
|
||||
(interactive)
|
||||
(when ollama-complete--overlay
|
||||
(let ((completion (overlay-get ollama-complete--overlay 'after-string)))
|
||||
(set-text-properties 0 (length completion) nil completion)
|
||||
(goto-char (overlay-start ollama-complete--overlay))
|
||||
(insert (substring-no-properties completion)))
|
||||
(ollama-complete--hide-overlay)))
|
||||
|
||||
(provide 'ollama-complete)
|
||||
#+end_src
|
||||
** smart-parens
|
||||
#+begin_src emacs-lisp
|
||||
(use-package smartparens
|
||||
|
|
Loading…
Reference in a new issue