branch: externals/llm
commit 1db38147a5af03aff19ab9ceed87b8697ce1315d
Author: Andrew Hyatt <[email protected]>
Commit: GitHub <[email protected]>
Use multiple reasoning tags for ollama via llm-ollama-reasoning-tags (#175)
This will fix https://github.com/ahyatt/llm/issues/170.
---
llm-ollama.el | 38 ++++++++++++++++++++++++++++++--------
1 file changed, 30 insertions(+), 8 deletions(-)
diff --git a/llm-ollama.el b/llm-ollama.el
index 4b34153388..40975e093b 100644
--- a/llm-ollama.el
+++ b/llm-ollama.el
@@ -105,6 +105,12 @@ PROVIDER is the llm-ollama provider."
(cl-defmethod llm-provider-batch-embeddings-extract-result ((_ llm-ollama)
response)
(append (assoc-default 'embeddings response) nil))
+(eval-and-compile
+ (defconst llm-ollama-reasoning-tags '("think" "reasoning")
+ "A list of possibilities for reasoning tags in Ollama responses.
+
+These are just the text inside the tag, not the tag itself."))
+
(cl-defmethod llm-provider-chat-extract-result ((_ llm-ollama) response)
"Return the chat response from the server RESPONSE."
(let ((raw-result (assoc-default 'content (assoc-default 'message
response))))
@@ -113,7 +119,9 @@ PROVIDER is the llm-ollama provider."
(with-temp-buffer
(insert raw-result)
(goto-char 0)
- (if (search-forward "\n</think>" nil t)
+ (if (seq-find (lambda (tag)
+ (search-forward (format "</%s>" tag) nil t))
+ llm-ollama-reasoning-tags)
(string-trim (buffer-substring (point) (point-max)))
raw-result))))
@@ -124,11 +132,19 @@ PROVIDER is the llm-ollama provider."
(with-temp-buffer
(insert raw-result)
(goto-char 0)
- (when (search-forward "<think>\n" nil t)
- (let* ((endtag "\n</think>")
- (end (save-excursion
- (search-forward endtag))))
- (buffer-substring (point) (- end (length endtag))))))))
+ (when (re-search-forward
+ (rx (seq (literal "<")
+ (group (eval `(or ,@llm-ollama-reasoning-tags)))
+ (literal ">")))
+ nil t)
+ (when-let* ((end (save-excursion
+ (re-search-forward
+ (rx (seq
+ (literal "</")
+ (group (literal (match-string 1)))
+ (literal ">"))) nil t))))
+ ;; +3 to account for the length of the two brackets and slash
+ (buffer-substring (point) (- end (+ 3 (length (match-string
1))))))))))
(defun llm-ollama--response-format (format)
"Return the response format for FORMAT."
@@ -219,9 +235,15 @@ PROVIDER is the llm-ollama provider."
;; The response from ollama should just have the tag
and
;; nothing more.
(cond
- ((string-match "<think>" response)
+ ((string-match (rx
+ (seq "<"
+ (eval `(or
,@llm-ollama-reasoning-tags))
+ ">")) response)
(setq in-reasoning t))
- ((string-match "</think>" response)
+ ((string-match (rx
+ (seq "</"
+ (eval `(or
,@llm-ollama-reasoning-tags))
+ ">")) response)
(setq in-reasoning nil))
(t (funcall receiver (list (if in-reasoning
:reasoning