|
7 | 7 | [hato.client :as http] |
8 | 8 | [hato.middleware :as hm] |
9 | 9 | [simulflow.async :refer [vthread vthread-loop]] |
10 | | - [simulflow.utils.core :as u]) |
| 10 | + [simulflow.utils.core :as u] |
| 11 | + [taoensso.telemere :as t]) |
11 | 12 | (:import |
12 | 13 | (java.io InputStream))) |
13 | 14 |
|
|
23 | 24 | (recur)))))) |
24 | 25 |
|
25 | 26 | (defn- parse-openai-event [raw-event] |
26 | | - (let [data-idx (string/index-of raw-event "{") |
| 27 | + (let [_ (t/log! {:level :trace :msg "SSE parsing raw event" :data {:raw-event-preview (take 100 raw-event)}}) |
| 28 | + data-idx (string/index-of raw-event "{") |
27 | 29 | done-idx (string/index-of raw-event "[DONE]")] |
| 30 | + (t/log! {:level :trace :msg "SSE parsing indices" :data {:data-idx data-idx :done-idx done-idx}}) |
28 | 31 | (if done-idx |
29 | | - :done |
30 | | - (-> (subs raw-event data-idx) |
31 | | - (u/parse-if-json :throw-on-error? true))))) |
| 32 | + (do |
| 33 | + (t/log! {:level :trace :msg "SSE parsing DONE event"}) |
| 34 | + :done) |
| 35 | + (let [json-str (subs raw-event data-idx) |
| 36 | + _ (t/log! {:level :trace :msg "SSE parsing JSON string" :data {:json-preview (take 100 json-str)}}) |
| 37 | + parsed (u/parse-if-json json-str :throw-on-error? true)] |
| 38 | + (t/log! {:level :trace :msg "SSE parsing result" :data {:parsed-preview (take 100 (str parsed))}}) |
| 39 | + parsed)))) |
32 | 40 |
|
33 | 41 | ; Per this discussion: https://community.openai.com/t/clarification-for-max-tokens/19576 |
34 | 42 | ; if the max_tokens is not provided, the response will try to use all the available |
|
48 | 56 | [{:keys [request params]}] |
49 | 57 | (let [close? (:stream/close? params) |
50 | 58 | parse-event (or (:parse-event params) parse-openai-event) |
51 | | - event-stream ^InputStream (:body (http/request (merge request |
52 | | - params |
53 | | - {:as :stream}))) |
| 59 | + result (http/request (merge request |
| 60 | + params |
| 61 | + {:as :stream})) |
| 62 | + _ (t/log! {:level :trace :msg "SSE Request result" :data result}) |
| 63 | + event-stream ^InputStream (:body result) |
54 | 64 | buffer-size (calc-buffer-size params) |
55 | 65 | events (a/chan (a/buffer buffer-size) (map parse-event))] |
56 | 66 | (vthread |
57 | 67 | (try |
58 | 68 | (loop [byte-coll []] |
59 | 69 | (let [byte-arr (byte-array (max 1 (.available event-stream))) |
60 | 70 | bytes-read (.read event-stream byte-arr)] |
| 71 | + (t/log! {:level :trace :msg "SSE read bytes" :data {:bytes-read bytes-read :available (.available event-stream)}}) |
61 | 72 |
|
62 | 73 | (if (neg? bytes-read) |
63 | 74 |
|
64 | 75 | ;; Input stream closed, exiting read-loop |
65 | | - nil |
| 76 | + (do |
| 77 | + (t/log! {:level :trace :msg "SSE stream closed"}) |
| 78 | + nil) |
66 | 79 |
|
67 | 80 | (let [next-byte-coll (concat byte-coll (seq byte-arr)) |
68 | 81 | data (slurp (byte-array next-byte-coll))] |
| 82 | + (t/log! {:level :trace :msg "SSE data chunk" :data {:data-length (count data) :data-preview (take 200 data)}}) |
69 | 83 | (if-let [es (not-empty (re-seq event-mask data))] |
70 | | - (if (every? true? (map #(a/>!! events %) es)) |
71 | | - (recur (drop (apply + (map #(count (.getBytes ^String %)) es)) |
72 | | - next-byte-coll)) |
73 | | - |
74 | | - ;; Output stream closed, exiting read-loop |
75 | | - nil) |
76 | | - |
77 | | - (recur next-byte-coll)))))) |
| 84 | + (do |
| 85 | + (t/log! {:level :trace :msg "SSE parsed events" :data {:event-count (count es) :events (map #(take 100 %) es)}}) |
| 86 | + (if (every? true? (map #(do |
| 87 | + (t/log! {:level :trace :msg "SSE putting event in channel" :data {:event (take 100 %)}}) |
| 88 | + (a/>!! events %)) es)) |
| 89 | + (recur (drop (apply + (map #(count (.getBytes ^String %)) es)) |
| 90 | + next-byte-coll)) |
| 91 | + |
| 92 | + ;; Output stream closed, exiting read-loop |
| 93 | + (do |
| 94 | + (t/log! {:level :trace :msg "SSE output stream closed during event sending"}) |
| 95 | + nil))) |
| 96 | + |
| 97 | + (do |
| 98 | + (t/log! {:level :trace :msg "SSE no events found in data chunk"}) |
| 99 | + (recur next-byte-coll))))))) |
78 | 100 | (finally |
79 | 101 | (when close? |
80 | 102 | (a/close! events)) |
|
0 commit comments