gptel: Unify error descriptions

* gptel.el (gptel--url-parse-response, gptel--insert-response):
Use the same error codes/descriptions across url-retrieve/Curl,
with and without streaming responses.

* gptel-curl.el (gptel-curl--parse-response,
gptel-curl--stream-filter, gptel-curl--stream-cleanup): Ditto.
This commit is contained in:
Karthik Chikmagalur 2023-04-08 12:22:36 -07:00
parent 1cd0f58552
commit 36051b15d5
2 changed files with 44 additions and 40 deletions

View file

@ -126,6 +126,7 @@ PROCESS and STATUS are process parameters."
(search-backward (plist-get info :token))
(backward-char)
(pcase-let* ((`(,_ . ,header-size) (read (current-buffer)))
(json-object-type 'plist)
(response (progn (goto-char header-size)
(condition-case nil (json-read)
(json-readtable-error 'json-read-error)))))
@ -134,8 +135,8 @@ PROCESS and STATUS are process parameters."
(let* ((error-plist (plist-get response :error))
(error-msg (plist-get error-plist :message))
(error-type (plist-get error-plist :type)))
(message "ChatGPT error: %s" error-msg)
(setq http-msg (concat http-msg ": " (string-trim error-type)))))
(message "ChatGPT error: (%s) %s" http-msg error-msg)
(setq http-msg (concat "(" http-msg ") " (string-trim error-type)))))
((eq response 'json-read-error)
(message "ChatGPT error (%s): Malformed JSON in response." http-msg))
(t (message "ChatGPT error (%s): Could not parse HTTP response." http-msg)))))
@ -200,7 +201,7 @@ See `gptel--url-get-response' for details."
(and (string-match "HTTP/[.0-9]+ +\\([0-9]+\\)" http-msg)
(match-string 1 http-msg)))))
(plist-put proc-info :http-status http-status)
(plist-put proc-info :http-msg http-msg))))
(plist-put proc-info :http-msg (string-trim http-msg)))))
(when-let ((http-msg (plist-get proc-info :http-msg))
(http-status (plist-get proc-info :http-status)))
@ -259,8 +260,9 @@ buffer."
;; (goto-char (point-min)))
(goto-char (point-min))
(if-let* ((http-msg (buffer-substring (line-beginning-position)
(line-end-position)))
(if-let* ((http-msg (string-trim
(buffer-substring (line-beginning-position)
(line-end-position))))
(http-status
(save-match-data
(and (string-match "HTTP/[.0-9]+ +\\([0-9]+\\)" http-msg)
@ -280,16 +282,16 @@ buffer."
(let* ((error-plist (plist-get response :error))
(error-msg (plist-get error-plist :message))
(error-type (plist-get error-plist :type)))
(message "ChatGPT error: %s" error-msg)
(list :content nil :status (concat http-msg ": " error-type))))
(message "ChatGPT error: (%s) %s" http-msg error-msg)
(list :content nil :status (concat "(" http-msg ") " (string-trim error-type)))))
((eq response 'json-read-error)
(message "ChatGPT error: Malformed JSON in response.")
(list :content nil :status (concat http-msg ": Malformed JSON in response.")))
(t (message "ChatGPT error: Could not parse HTTP response.")
(list :content nil :status (concat http-msg ": Could not parse HTTP response."))))
(message "ChatGPT error: Could not parse HTTP response.")
(message "ChatGPT error: (%s) Malformed JSON in response." http-msg)
(list :content nil :status (concat "(" http-msg ") Malformed JSON in response.")))
(t (message "ChatGPT error (%s): Could not parse HTTP response." http-msg)
(list :content nil :status (concat "(" http-msg ") Could not parse HTTP response."))))
(message "ChatGPT error: (%s) Could not parse HTTP response." http-msg)
(list :content nil
:status (concat http-msg ": Could not parse HTTP response.")))))))
:status (concat "(" http-msg ") Could not parse HTTP response.")))))))
(provide 'gptel-curl)
;;; gptel-curl.el ends here

View file

@ -317,24 +317,25 @@ See `gptel--url-get-response' for details."
(status-str (plist-get response :status))
(gptel-buffer (plist-get info :gptel-buffer))
(start-marker (plist-get info :start-marker)))
(if content-str
(with-current-buffer gptel-buffer
(setq content-str (gptel--transform-response
content-str gptel-buffer))
(save-excursion
(put-text-property 0 (length content-str) 'gptel 'response content-str)
(message "Querying ChatGPT... done.")
(goto-char start-marker)
(unless (bobp) (insert "\n\n"))
(let ((p (point)))
(insert content-str)
(pulse-momentary-highlight-region p (point)))
(when gptel-mode
(with-current-buffer gptel-buffer
(if content-str
(progn
(setq content-str (gptel--transform-response
content-str gptel-buffer))
(save-excursion
(put-text-property 0 (length content-str) 'gptel 'response content-str)
(message "Querying ChatGPT... done.")
(goto-char start-marker)
(unless (bobp) (insert "\n\n"))
(let ((p (point)))
(insert content-str)
(pulse-momentary-highlight-region p (point)))
(when gptel-mode
(insert "\n\n" (gptel-prompt-string))
(gptel--update-header-line " Ready" 'success))))
(gptel--update-header-line
(format " Response Error: %s" status-str) 'error))
(run-hooks 'gptel-post-response-hook)))
(gptel--update-header-line
(format " Response Error: %s" status-str) 'error))
(run-hooks 'gptel-post-response-hook))))
(defun gptel--create-prompt (&optional prompt-end)
"Return a full conversation prompt from the contents of this buffer.
@ -452,7 +453,8 @@ the response is inserted into the current buffer after point."
(with-current-buffer response-buffer
(clone-buffer "*gptel-error*" 'show)))
(with-current-buffer response-buffer
(if-let* ((status (buffer-substring (line-beginning-position) (line-end-position)))
(if-let* ((http-msg (string-trim (buffer-substring (line-beginning-position)
(line-end-position))))
(json-object-type 'plist)
(response (progn (forward-paragraph)
(let ((json-str (decode-coding-string
@ -462,23 +464,23 @@ the response is inserted into the current buffer after point."
(json-read-from-string json-str)
(json-readtable-error 'json-read-error))))))
(cond
((string-match-p "200 OK" status)
((string-match-p "200 OK" http-msg)
(list :content (string-trim (map-nested-elt response '(:choices 0 :message :content)))
:status status))
:status http-msg))
((plist-get response :error)
(let* ((error-plist (plist-get response :error))
(error-msg (plist-get error-plist :message))
(error-type (plist-get error-plist :type)))
(message "ChatGPT error: %s" error-msg)
(list :content nil :status (concat status ": " error-type))))
(message "ChatGPT error: (%s) %s" http-msg error-msg)
(list :content nil :status (concat "(" http-msg ") " error-type))))
((eq response 'json-read-error)
(message "ChatGPT error: Malformed JSON in response.")
(list :content nil :status (concat status ": Malformed JSON in response.")))
(t (message "ChatGPT error: Could not parse HTTP response.")
(list :content nil :status (concat status ": Could not parse HTTP response."))))
(message "ChatGPT error: Could not parse HTTP response.")
(message "ChatGPT error: (%s) Malformed JSON in response." http-msg)
(list :content nil :status (concat http-msg ": Malformed JSON in response.")))
(t (message "ChatGPT error: (%s) Could not parse HTTP response." http-msg)
(list :content nil :status (concat "(" http-msg ") Could not parse HTTP response."))))
(message "ChatGPT error: (%s) Could not parse HTTP response." http-msg)
(list :content nil
:status (concat status ": Could not parse HTTP response."))))))
:status (concat "(" http-msg ") Could not parse HTTP response."))))))
;;;###autoload
(defun gptel (name &optional api-key initial)