branch: externals/llm
commit 40909718cc835c23e2eab25756280af91d3921da
Author: Andrew Hyatt <ahy...@gmail.com>
Commit: Andrew Hyatt <ahy...@gmail.com>

    Fix function calling for Gemini & Vertex, and streaming for Gemini
    
    The errors fixed were discussed in https://github.com/ahyatt/llm/pull/31
---
 llm-gemini.el | 23 +++++++++++++++--------
 llm-vertex.el | 51 +++++++++++++++++++++++++++++----------------------
 2 files changed, 44 insertions(+), 30 deletions(-)

diff --git a/llm-gemini.el b/llm-gemini.el
index 6e713e00fd..95735c55ca 100644
--- a/llm-gemini.el
+++ b/llm-gemini.el
@@ -103,8 +103,9 @@ If STREAMING-P is non-nil, use the streaming endpoint."
 (cl-defmethod llm-chat ((provider llm-gemini) prompt)
   (llm-vertex--process-and-return
    provider prompt
-   (llm-request-plz-sync (llm-gemini--chat-url provider nil)
-                         :data (llm-gemini--chat-request prompt))))
+   (llm-vertex--get-chat-response
+    (llm-request-plz-sync (llm-gemini--chat-url provider nil)
+                          :data (llm-gemini--chat-request prompt)))))
 
 (cl-defmethod llm-chat-async ((provider llm-gemini) prompt response-callback 
error-callback)
   (let ((buf (current-buffer)))
@@ -115,27 +116,33 @@ If STREAMING-P is non-nil, use the streaming endpoint."
                                           buf response-callback
                                           (llm-vertex--process-and-return
                                            provider prompt
-                                           data)))
+                                           (llm-vertex--get-chat-response 
data))))
                            :on-error (lambda (_ data)
                                        (llm-request-callback-in-buffer buf 
error-callback 'error
                                                                        
(llm-vertex--error-message data))))))
 
 (cl-defmethod llm-chat-streaming ((provider llm-gemini) prompt 
partial-callback response-callback error-callback)
   (let ((buf (current-buffer))
-        (streamed-text ""))
+        (streamed-text "")
+        (function-call nil))
     (llm-request-plz-json-array
      (llm-gemini--chat-url provider t)
      :data (llm-gemini--chat-request prompt)
      :on-element (lambda (element)
                    (when-let ((response (llm-vertex--get-chat-response 
element)))
-                     (when (> (length response) 0)
-                       (setq streamed-text (concat streamed-text response))
-                       (llm-request-callback-in-buffer buf partial-callback 
streamed-text))))
+                     (if (stringp response)
+                         (when (> (length response) 0)
+                           (setq streamed-text (concat streamed-text response))
+                           (llm-request-callback-in-buffer buf 
partial-callback streamed-text))
+                       (setq function-call response))))
      :on-success (lambda (data)
                    (llm-request-callback-in-buffer
                     buf response-callback
                     (llm-vertex--process-and-return
-                     provider prompt streamed-text)))
+                     provider prompt (or function-call
+                                         (if (> (length streamed-text) 0)
+                                             streamed-text
+                                           (llm-vertex--get-chat-response 
data))))))
      :on-error (lambda (_ data)
                  (llm-request-callback-in-buffer buf error-callback 'error
                                                  (llm-vertex--error-message 
data))))))
diff --git a/llm-vertex.el b/llm-vertex.el
index 24e56ee358..b50ceae2c1 100644
--- a/llm-vertex.el
+++ b/llm-vertex.el
@@ -270,8 +270,7 @@ ERROR-CALLBACK is called when an error is detected."
   (let ((return-val
          (llm-provider-utils-process-result
           provider prompt
-          (llm-vertex--normalize-function-calls
-           (if (stringp response) response (llm-vertex--get-chat-response 
response))))))
+          (llm-vertex--normalize-function-calls response))))
     return-val))
 
 (defun llm-vertex--chat-url (provider &optional streaming)
@@ -289,44 +288,52 @@ If STREAMING is non-nil, use the URL for the streaming 
API."
   ;; Gemini just has a streaming response, but we can just call it 
synchronously.
   (llm-vertex-refresh-key provider)
   (llm-vertex--process-and-return
-     provider prompt
-     (llm-request-plz-sync (llm-vertex--chat-url provider)
-                           :headers `(("Authorization" . ,(format "Bearer %s" 
(llm-vertex-key provider))))
-                           :data (llm-vertex--chat-request prompt))))
+   provider prompt
+   (llm-vertex--get-chat-response
+    (llm-request-plz-sync (llm-vertex--chat-url provider)
+                          :headers `(("Authorization" . ,(format "Bearer %s" 
(llm-vertex-key provider))))
+                          :data (llm-vertex--chat-request prompt)))))
 
 (cl-defmethod llm-chat-async ((provider llm-vertex) prompt response-callback 
error-callback)
   (llm-vertex-refresh-key provider)
   (let ((buf (current-buffer)))
-    (llm-request-plz-async (llm-vertex--chat-url provider)
-                           :headers `(("Authorization" . ,(format "Bearer %s" 
(llm-vertex-key provider))))
-                           :data (llm-vertex--chat-request prompt)
-                           :on-success (lambda (data)
-                                         (llm-request-callback-in-buffer
-                                          buf response-callback
-                                          (llm-vertex--process-and-return
-                                           provider prompt data)))
-                           :on-error (lambda (_ data)
-                                       (llm-request-callback-in-buffer buf 
error-callback 'error
-                                                                       
(llm-vertex--error-message data))))))
+    (llm-request-plz-async
+     (llm-vertex--chat-url provider)
+     :headers `(("Authorization" . ,(format "Bearer %s" (llm-vertex-key 
provider))))
+     :data (llm-vertex--chat-request prompt)
+     :on-success (lambda (data)
+                   (llm-request-callback-in-buffer
+                    buf response-callback
+                    (llm-vertex--process-and-return
+                     provider prompt (llm-vertex--get-chat-response data))))
+     :on-error (lambda (_ data)
+                 (llm-request-callback-in-buffer buf error-callback 'error
+                                                 (llm-vertex--error-message 
data))))))
 
 (cl-defmethod llm-chat-streaming ((provider llm-vertex) prompt 
partial-callback response-callback error-callback)
   (llm-vertex-refresh-key provider)
   (let ((buf (current-buffer))
-        (streamed-text ""))
+        (streamed-text "")
+        (function-call nil))
     (llm-request-plz-json-array
      (llm-vertex--chat-url provider)
      :headers `(("Authorization" . ,(format "Bearer %s" (llm-vertex-key 
provider))))
      :data (llm-vertex--chat-request prompt)
      :on-element (lambda (element)
                    (when-let ((response (llm-vertex--get-chat-response 
element)))
-                     (when (> (length response) 0)
-                       (setq streamed-text (concat streamed-text response))
-                       (llm-request-callback-in-buffer buf partial-callback 
streamed-text))))
+                     (if (stringp response)
+                         (when (> (length response) 0)
+                           (setq streamed-text (concat streamed-text response))
+                           (llm-request-callback-in-buffer buf 
partial-callback streamed-text))
+                       (setq function-call response))))
      :on-success (lambda (data)
                    (llm-request-callback-in-buffer
                     buf response-callback
                     (llm-vertex--process-and-return
-                     provider prompt streamed-text)))
+                     provider prompt (or function-call
+                                         (if (> (length streamed-text) 0)
+                                             streamed-text
+                                           (llm-vertex--get-chat-response 
data))))))
      :on-error (lambda (_ data)
                  (llm-request-callback-in-buffer buf error-callback 'error
                                                  (llm-vertex--error-message 
data))))))

Reply via email to