image.scm 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. ;;; guile-openai --- An OpenAI API client for Guile
  2. ;;; Copyright © 2023 Andrew Whatson <whatson@tailcall.au>
  3. ;;;
  4. ;;; This file is part of guile-openai.
  5. ;;;
  6. ;;; guile-openai is free software: you can redistribute it and/or modify
  7. ;;; it under the terms of the GNU Affero General Public License as
  8. ;;; published by the Free Software Foundation, either version 3 of the
  9. ;;; License, or (at your option) any later version.
  10. ;;;
  11. ;;; guile-openai is distributed in the hope that it will be useful, but
  12. ;;; WITHOUT ANY WARRANTY; without even the implied warranty of
  13. ;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  14. ;;; Affero General Public License for more details.
  15. ;;;
  16. ;;; You should have received a copy of the GNU Affero General Public
  17. ;;; License along with guile-openai. If not, see
  18. ;;; <https://www.gnu.org/licenses/>.
  19. (define-module (openai api image)
  20. #:use-module (openai client)
  21. #:use-module (openai utils multipart)
  22. #:use-module (ice-9 match)
  23. #:use-module (json record)
  24. #:use-module (pict base64)
  25. #:use-module (srfi srfi-71)
  26. #:use-module (web client)
  27. #:export (make-image-request
  28. json->image-request
  29. image-request->json
  30. image-request?
  31. image-request-prompt
  32. image-request-n
  33. image-request-size
  34. image-request-response-format
  35. image-request-user
  36. make-image-variation-request
  37. json->image-variation-request
  38. image-variation-request->multipart
  39. image-variation-request?
  40. image-variation-request-image
  41. image-variation-request-n
  42. image-variation-request-size
  43. image-variation-request-response-format
  44. image-variation-request-user
  45. make-image-edit-request
  46. json->image-edit-request
  47. image-edit-request->multipart
  48. image-edit-request?
  49. image-edit-request-image
  50. image-edit-request-mask
  51. image-edit-request-prompt
  52. image-edit-request-n
  53. image-edit-request-size
  54. image-edit-request-response-format
  55. image-edit-request-user
  56. make-image-response
  57. json->image-response
  58. image-response->json
  59. image-response?
  60. image-response-created
  61. image-response-data
  62. make-image-data
  63. json->image-data
  64. image-data->json
  65. image-data?
  66. image-data-url
  67. image-data-b64-json
  68. send-image-request
  69. send-image-edit-request
  70. send-image-variation-request
  71. fetch-image-data))
  72. ;; See https://platform.openai.com/docs/api-reference/images
  73. (define-json-type <image-request>
  74. (prompt)
  75. (n)
  76. (size) ;; 256x256 512x512 1024x1024
  77. (response-format "response_format") ;; url b64_json
  78. (user))
  79. (define-json-type <image-variation-request>
  80. (image)
  81. (n)
  82. (size) ;; 256x256 512x512 1024x1024
  83. (response-format "response_format") ;; url b64_json
  84. (user))
  85. (define-json-type <image-edit-request>
  86. (image)
  87. (mask)
  88. (prompt)
  89. (n)
  90. (size) ;; 256x256 512x512 1024x1024
  91. (response-format "response_format") ;; url b64_json
  92. (user))
  93. (define-json-type <image-response>
  94. (created)
  95. (data "data" #(<image-data>)))
  96. (define-json-type <image-data>
  97. (url)
  98. (b64-json "b64_json"))
  99. (define (image-variation-request->multipart request)
  100. (match request
  101. (($ <image-variation-request> image n size response-format user)
  102. (append (multipart-param 'n n)
  103. (multipart-param 'size size)
  104. (multipart-param 'response_format response-format)
  105. (multipart-param 'user user)
  106. (multipart-file 'image image)))))
  107. (define (image-edit-request->multipart request)
  108. (match request
  109. (($ <image-edit-request> image mask prompt n size response-format user)
  110. (append (multipart-param 'prompt prompt)
  111. (multipart-param 'n n)
  112. (multipart-param 'size size)
  113. (multipart-param 'response_format response-format)
  114. (multipart-param 'user user)
  115. (multipart-file 'image image)
  116. (multipart-file 'mask mask)))))
  117. (define (send-image-request request)
  118. (json->image-response
  119. (openai-post-json "/v1/images/generations"
  120. (image-request->json request))))
  121. (define (send-image-edit-request request)
  122. (json->image-response
  123. (openai-post-multipart "/v1/images/edits"
  124. (image-edit-request->multipart request))))
  125. (define (send-image-variation-request request)
  126. (json->image-response
  127. (openai-post-multipart "/v1/images/variations"
  128. (image-variation-request->multipart request))))
  129. (define (fetch-image-data img)
  130. (match img
  131. (($ <image-data> (? string? url))
  132. (let ((rsp bv (http-request url)))
  133. bv))
  134. (($ <image-data> _ (? string? b64))
  135. (base64-decode b64))))