branch: elpa/gptel
commit 0dacb474f887ede2dbbc6d315624ff54274cb766
Author: Karthik Chikmagalur <[email protected]>
Commit: Karthik Chikmagalur <[email protected]>
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.