branch: elpa/gptel
commit aef57c2d3f99b894938450ec6a241a9959966973
Author: Karthik Chikmagalur <karthikchikmaga...@gmail.com>
Commit: Karthik Chikmagalur <karthikchikmaga...@gmail.com>

    gptel-openai-extras: Fix Deepseek repeated roles error
    
    * gptel-openai-extras.el (gptel--parse-buffer): Add a cl-defmethod
    for gptel-deepseek to merge successive prompts with the same
    role (user/assistant) in the messages array.  The Deepseek API
    requires strictly alternating message roles in the conversation prompt.
---
 gptel-openai-extras.el | 19 +++++++++++++++++++
 1 file changed, 19 insertions(+)

diff --git a/gptel-openai-extras.el b/gptel-openai-extras.el
index e5b7b04dc6..c9e0630747 100644
--- a/gptel-openai-extras.el
+++ b/gptel-openai-extras.el
@@ -309,6 +309,25 @@ parameters."
     (when (and (stringp reasoning) (length> reasoning 0))
       (plist-put info :reasoning reasoning))))
 
+(cl-defmethod gptel--parse-buffer :around ((_backend gptel-deepseek) 
max-entries)
+  "Merge successive prompts in the prompts list that have the same role.
+
+The Deepseek API requires strictly alternating roles (user/assistant) in 
messages."
+  (let* ((prompts (cl-call-next-method))
+         (index prompts))
+    (prog1 prompts
+      (while index
+        (let ((p1 (car index))
+              (p2 (cadr index))
+              (rest (cdr index)))
+          (when (and p2 (equal (plist-get p1 :role)
+                               (plist-get p2 :role)))
+            (setf (plist-get p1 :content)
+                  (concat (plist-get p1 :content) "\n"
+                          (plist-get p2 :content)))
+            (setcdr index (cdr rest)))
+          (setq index (cdr index)))))))
+
 ;;;###autoload
 (cl-defun gptel-make-deepseek
     (name &key curl-args stream key request-params

Reply via email to