Skip to content

Commit 583a309

Browse files
authored
Merge pull request #72 from wkok/azure-transcriptions-translations
Patched the azure schema to properly support multipart file uploads
2 parents 310d8df + f4f1fe1 commit 583a309

File tree

1 file changed

+84
-18
lines changed

1 file changed

+84
-18
lines changed

Diff for: src/wkok/openai_clojure/azure.clj

+84-18
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,9 @@
66
[martian.core :as martian]
77
[martian.hato :as martian-http]
88
[wkok.openai-clojure.interceptors :as openai-interceptors]
9-
[wkok.openai-clojure.sse :as sse]))
9+
[wkok.openai-clojure.sse :as sse]
10+
[martian.interceptors :as interceptors]
11+
[martian.encoders :as encoders]))
1012

1113
(def add-authentication-header
1214
{:name ::add-authentication-header
@@ -26,11 +28,6 @@
2628
idx (s/index-of url "/openai")]
2729
(str endpoint (subs url idx))))))})
2830

29-
(defn- ->patched-handler
30-
[m from to]
31-
(-> (martian/handler-for m :completions-create)
32-
(assoc :route-name :create-completion)))
33-
3431
(def route-mappings
3532
{:completions-create :create-completion
3633
:chat-completions-create :create-chat-completion
@@ -51,23 +48,92 @@
5148
(defn load-openai-spec []
5249
(json/decode (slurp (io/resource "azure_openai.json")) keyword))
5350

51+
(defn- multipart-form-data?
52+
[handler]
53+
(-> handler :openapi-definition :requestBody :content :multipart/form-data))
54+
55+
(defn- param->multipart-entry
56+
[[param content]]
57+
{:name (name param)
58+
:content (if (or (instance? java.io.File content)
59+
(instance? java.io.InputStream content)
60+
(bytes? content))
61+
content
62+
(str content))})
63+
64+
(def multipart-form-data
65+
{:name ::multipart-form-data
66+
:enter (fn [{:keys [handler params] :as ctx}]
67+
(let [params' (:martian.core/body params)]
68+
(if (multipart-form-data? handler)
69+
(-> (assoc-in ctx [:request :multipart]
70+
(map param->multipart-entry params'))
71+
(update-in [:request :headers] dissoc "Content-Type")
72+
(update :request dissoc :body))
73+
ctx)))})
74+
75+
(defn update-file-schema
76+
[m operation-id field-name]
77+
(martian/update-handler m operation-id assoc-in [:body-schema :body field-name] java.io.File))
78+
79+
(defn update-file-schemas
80+
[m]
81+
(-> m
82+
(update-file-schema :transcriptions-create :file)
83+
(update-file-schema :translations-create :file)))
84+
85+
86+
(defn bootstrap-openapi
87+
"Bootstrap the martian from a local copy of the openai swagger spec"
88+
[]
89+
(let [definition (load-openai-spec)
90+
base-url "/openai"
91+
encoders (assoc (encoders/default-encoders)
92+
"multipart/form-data" nil
93+
"application/octet-stream" nil)
94+
opts (update martian-http/default-opts
95+
:interceptors (fn [interceptors]
96+
(-> interceptors
97+
(interceptors/inject
98+
add-authentication-header
99+
:after
100+
:martian.interceptors/header-params)
101+
(interceptors/inject
102+
multipart-form-data
103+
:after
104+
::add-authentication-header)
105+
(interceptors/inject
106+
openai-interceptors/set-request-options
107+
:before
108+
:martian.hato/perform-request)
109+
(interceptors/inject
110+
override-api-endpoint
111+
:before
112+
:martian.hato/perform-request)
113+
(interceptors/inject
114+
sse/perform-sse-capable-request
115+
:replace
116+
:martian.hato/perform-request)
117+
(interceptors/inject
118+
(interceptors/encode-body encoders)
119+
:replace
120+
:martian.interceptors/encode-body)
121+
(interceptors/inject
122+
(interceptors/coerce-response encoders)
123+
:replace
124+
:martian.interceptors/coerce-response))))]
125+
126+
(-> (martian/bootstrap-openapi base-url definition opts)
127+
update-file-schemas)))
128+
54129
(def m
55130
(delay
56131
(patch-handler
57-
(martian/bootstrap-openapi "/openai"
58-
(load-openai-spec)
59-
(update
60-
martian-http/default-opts
61-
:interceptors
62-
#(-> (remove (comp #{martian-http/perform-request}) %)
63-
(concat [add-authentication-header
64-
openai-interceptors/set-request-options
65-
override-api-endpoint
66-
sse/perform-sse-capable-request])))))))
132+
(bootstrap-openapi))))
67133

68134
(defn patch-params [params]
69-
{:api-version "2024-06-01"
70-
:deployment-id (:model params)
135+
{:api-version "2024-06-01"
136+
:deployment-id (:model params)
71137
:martian.core/body (dissoc params :model)})
72138

73139

0 commit comments

Comments
 (0)