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.