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

    gptel: Add generic gptel--parse-list function
    
    * gptel.el:
    (gptel--parse-list): Generic function to parse a list of strings
    into a conversation prompt, assigning alternating user and
    assistant roles to the strings.  The form of the prompt is
    API-specific and implementations for each backend type are needed.
    This is useful to construct and send "synthetic"
    prompts (templated conversations) using `gptel-request'.
    
    * gptel-openai.el (gptel--parse-list): Add implementation for
    OpenAI.
    
    * gptel-ollama.el (gptel--parse-list): Add implementation for
    Ollama.
    
    * gptel-gemini.el (gptel--parse-list): Add implementation for
    Gemini.
    
    * gptel-anthropic.el (gptel--parse-list): Add implementation for
    Anthropic.
---
 gptel-anthropic.el |  7 +++++++
 gptel-gemini.el    |  9 +++++++++
 gptel-ollama.el    |  6 ++++++
 gptel-openai.el    |  6 ++++++
 gptel.el           | 10 ++++++++++
 5 files changed, 38 insertions(+)

diff --git a/gptel-anthropic.el b/gptel-anthropic.el
index 5680bb451f..cfe00c0213 100644
--- a/gptel-anthropic.el
+++ b/gptel-anthropic.el
@@ -81,6 +81,13 @@
      (gptel-backend-request-params gptel-backend)
      (gptel--model-request-params  gptel-model))))
 
+(cl-defmethod gptel--parse-list ((_backend gptel-anthropic) prompt-list)
+  (cl-loop for text in prompt-list
+           for role = t then (not role)
+           if text collect
+           (list :role (if role "user" "assistant")
+                 :content `[(:type "text" :text ,text)])))
+
 (cl-defmethod gptel--parse-buffer ((_backend gptel-anthropic) &optional 
max-entries)
   (let ((prompts) (prop)
         (include-media (and gptel-track-media (or (gptel--model-capable-p 
'media)
diff --git a/gptel-gemini.el b/gptel-gemini.el
index 2954a1cfc3..f28b5f8bac 100644
--- a/gptel-gemini.el
+++ b/gptel-gemini.el
@@ -104,6 +104,15 @@
      (gptel-backend-request-params gptel-backend)
      (gptel--model-request-params  gptel-model))))
 
+(cl-defmethod gptel--parse-list ((_backend gptel-gemini) prompt-list)
+  (cl-loop for text in prompt-list
+           for role = t then (not role)
+           if text
+           if role
+           collect (list :role "user" :parts `[(:text ,text)]) into prompts
+           else collect (list :role "model" :parts `(:text ,text)) into prompts
+           finally return prompts))
+
 (cl-defmethod gptel--parse-buffer ((_backend gptel-gemini) &optional 
max-entries)
   (let ((prompts) (prop)
         (include-media (and gptel-track-media (or (gptel--model-capable-p 
'media)
diff --git a/gptel-ollama.el b/gptel-ollama.el
index d37d02f6d2..236640bb2d 100644
--- a/gptel-ollama.el
+++ b/gptel-ollama.el
@@ -106,6 +106,12 @@ Intended for internal use only.")
      (gptel-backend-request-params gptel-backend)
      (gptel--model-request-params  gptel-model))))
 
+(cl-defmethod gptel--parse-list ((_backend gptel-ollama) prompt-list)
+  (cl-loop for text in (cdr prompt-list)
+           for role = t then (not role)
+           if text collect
+           (list :role (if role "user" "assistant") :content text)))
+
 (cl-defmethod gptel--parse-buffer ((_backend gptel-ollama) &optional 
max-entries)
   (let ((prompts) (prop)
         (include-media (and gptel-track-media (or (gptel--model-capable-p 
'media)
diff --git a/gptel-openai.el b/gptel-openai.el
index 9f19a0e310..4f13f7e931 100644
--- a/gptel-openai.el
+++ b/gptel-openai.el
@@ -163,6 +163,12 @@ with differing settings.")
      (gptel-backend-request-params gptel-backend)
      (gptel--model-request-params  gptel-model))))
 
+(cl-defmethod gptel--parse-list ((_backend gptel-openai) prompt-list)
+  (cl-loop for text in prompt-list
+           for role = t then (not role)
+           if text collect
+           (list :role (if role "user" "assistant") :content text)))
+
 (cl-defmethod gptel--parse-buffer ((_backend gptel-openai) &optional 
max-entries)
   (let ((prompts) (prop)
         (include-media (and gptel-track-media
diff --git a/gptel.el b/gptel.el
index e27f4abfb6..76426b56ed 100644
--- a/gptel.el
+++ b/gptel.el
@@ -1480,6 +1480,16 @@ BACKEND is the LLM backend in use.
 MAX-ENTRIES is the number of queries/responses to include for
 contexbt.")
 
+(cl-defgeneric gptel--parse-list (backend prompt-list)
+  "Parse PROMPT-LIST and return a list of prompts suitable for
+BACKEND.
+
+PROMPT-LIST is interpreted as a conversation, i.e. an alternating
+series of user prompts and LLM responses.  The returned structure
+is suitable for including in the request payload.
+
+BACKEND is the LLM backend in use.")
+
 (cl-defgeneric gptel--parse-media-links (mode beg end)
   "Find media links between BEG and END.
 

Reply via email to