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))))))