[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[elpa] externals/ellama a8830956a5 3/5: Add ellama-chain function
From: |
ELPA Syncer |
Subject: |
[elpa] externals/ellama a8830956a5 3/5: Add ellama-chain function |
Date: |
Mon, 13 May 2024 09:58:00 -0400 (EDT) |
branch: externals/ellama
commit a8830956a543c818be12842e920490dc459cf0f6
Author: Sergey Kostyaev <sskostyaev@gmail.com>
Commit: Sergey Kostyaev <sskostyaev@gmail.com>
Add ellama-chain function
---
ellama.el | 105 +++++++++++++++++++++++++++++++++++++++++++++-----------------
1 file changed, 77 insertions(+), 28 deletions(-)
diff --git a/ellama.el b/ellama.el
index c9de150080..1f92817bd1 100644
--- a/ellama.el
+++ b/ellama.el
@@ -430,6 +430,11 @@ This filter contains only subset of markdown syntax to be
good enough."
:group 'ellama
:type '(sexp :validate 'cl-struct-p))
+(defcustom ellama-always-show-chain-steps nil
+ "Always show ellama chain buffers."
+ :type 'boolean
+ :group 'ellama)
+
(defvar-local ellama--current-session nil)
(defvar ellama--current-session-id nil)
@@ -1040,6 +1045,50 @@ when the request completes (with BUFFER current)."
(setq ellama--current-request nil)
(ellama-request-mode -1)))))))))
+(defun ellama-chain (initial-prompt forms)
+ "Call chain of FORMS on INITIAL-PROMPT.
+Each form is a plist that can contain different options:
+
+:provider PROVIDER - use PROVIDER instead of `ellama-provider'.
+
+:transform FUNCTION - use FUNCTION to transform result of previous step to new
+prompt.
+
+:session SESSION - use SESSION in current step.
+
+:chat BOOL - if BOOL use chat buffer, otherwise use temp buffer. Make sense
for
+last step only.
+
+:show BOOL - if BOOL show buffer for this step."
+ (let* ((hd (car forms))
+ (tl (cdr forms))
+ (provider (or (plist-get hd :provider) ellama-provider))
+ (transform (or (plist-get hd :transform) #'identity))
+ (prompt (apply transform (list initial-prompt)))
+ (session (plist-get hd :session))
+ (chat (plist-get hd :chat))
+ (show (or (plist-get hd :show) ellama-always-show-chain-steps chat))
+ (buf (if (or (and tl (not chat)) (not session))
+ (get-buffer-create (make-temp-name
+ (ellama-generate-name provider
real-this-command prompt)))
+ (ellama-get-session-buffer ellama--current-session-id))))
+ (when show
+ (display-buffer buf))
+ (with-current-buffer buf
+ (funcall ellama-major-mode))
+ (if chat
+ (ellama-chat prompt nil :provider provider)
+ (ellama-stream
+ prompt
+ :provider provider
+ :buffer buf
+ :session session
+ :filter (when (derived-mode-p 'org-mode)
+ #'ellama--translate-markdown-to-org-filter)
+ :on-done (lambda (res)
+ (when tl
+ (ellama-chain res tl)))))))
+
(defun ellama-chat-done (text)
"Chat done.
Will call `ellama-chat-done-callback' on TEXT."
@@ -1121,34 +1170,34 @@ ARGS contains keys for fine control.
(interactive "sAsk ellama: ")
(let* ((providers (append
`(("default model" . ellama-provider)
- ,(if (and ellama-ollama-binary (file-exists-p
ellama-ollama-binary))
- '("ollama model" .
(ellama-get-ollama-local-model))))
+ ,(if (and ellama-ollama-binary (file-exists-p
ellama-ollama-binary))
+ '("ollama model" .
(ellama-get-ollama-local-model))))
ellama-providers))
- (variants (mapcar #'car providers))
- (provider (if current-prefix-arg
- (eval (alist-get
- (completing-read "Select model: "
variants)
- providers nil nil #'string=))
- (or (plist-get args :provider)
- ellama-provider)))
- (session (if (or create-session
- current-prefix-arg
- (and (not ellama--current-session)
- (not ellama--current-session-id)))
- (ellama-new-session provider prompt)
- (or ellama--current-session
- (with-current-buffer
(ellama-get-session-buffer
-
ellama--current-session-id)
- ellama--current-session))))
- (buffer (ellama-get-session-buffer
- (ellama-session-id session)))
- (file-name (ellama-session-file session))
- (translation-buffer (when ellama-chat-translation-enabled
- (if file-name
- (progn
- (find-file-noselect
-
(ellama--get-translation-file-name file-name)))
- (get-buffer-create
(ellama-session-id session))))))
+ (variants (mapcar #'car providers))
+ (provider (if current-prefix-arg
+ (eval (alist-get
+ (completing-read "Select model: " variants)
+ providers nil nil #'string=))
+ (or (plist-get args :provider)
+ ellama-provider)))
+ (session (if (or create-session
+ current-prefix-arg
+ (and (not ellama--current-session)
+ (not ellama--current-session-id)))
+ (ellama-new-session provider prompt)
+ (or ellama--current-session
+ (with-current-buffer (ellama-get-session-buffer
+ ellama--current-session-id)
+ ellama--current-session))))
+ (buffer (ellama-get-session-buffer
+ (ellama-session-id session)))
+ (file-name (ellama-session-file session))
+ (translation-buffer (when ellama-chat-translation-enabled
+ (if file-name
+ (progn
+ (find-file-noselect
+ (ellama--get-translation-file-name
file-name)))
+ (get-buffer-create (ellama-session-id
session))))))
(if ellama-chat-translation-enabled
(ellama--translate-interaction prompt translation-buffer buffer session)
(display-buffer buffer)
@@ -1156,7 +1205,7 @@ ARGS contains keys for fine control.
(save-excursion
(goto-char (point-max))
(insert (ellama-get-nick-prefix-for-mode) " " ellama-user-nick ":\n"
- (ellama--format-context session) prompt "\n\n"
+ (ellama--format-context session) (ellama--fill-long-lines
prompt) "\n\n"
(ellama-get-nick-prefix-for-mode) " " ellama-assistant-nick
":\n")
(ellama-stream prompt
:session session