|
48 | 48 | api-key past-messages tools] |
49 | 49 | :or {max-tokens 1024 |
50 | 50 | temperature 1.0}} |
51 | | - {:keys [on-message-received on-error]}] |
52 | | - (let [body {:model model |
53 | | - :messages (conj past-messages {:role "user" :content user-prompt}) |
| 51 | + {:keys [on-message-received on-error on-tool-called]}] |
| 52 | + (let [messages (conj past-messages {:role "user" :content user-prompt}) |
| 53 | + body {:model model |
| 54 | + :messages messages |
54 | 55 | :max_tokens max-tokens |
55 | 56 | :temperature temperature |
56 | 57 | ;; TODO support :thinking |
57 | 58 | :stream true |
58 | 59 | :tools (->tools tools) |
59 | 60 | :system context} |
| 61 | + content-block* (atom nil) |
60 | 62 | on-response-fn (fn handle-response [event data] |
61 | 63 | (case event |
62 | 64 | "content_block_delta" (case (-> data :delta :type) |
63 | 65 | "text_delta" (on-message-received {:message (-> data :delta :text)}) |
| 66 | + "input_json_delta" (swap! content-block* update-in [(:index data) :input-json] str (-> data :delta :partial_json)) |
64 | 67 | (logger/warn "Unkown response delta type" (-> data :delta :type))) |
65 | | - "message_stop" (on-message-received {:finish-reason (:type data)}) |
| 68 | + "content_block_start" (case (-> data :content_block :type) |
| 69 | + "tool_use" (swap! content-block* assoc (:index data) (:content_block data)) |
| 70 | + |
| 71 | + nil) |
| 72 | + "message_delta" (case (-> data :delta :stop_reason) |
| 73 | + "tool_use" (doseq [content-block (vals @content-block*)] |
| 74 | + (when (= "tool_use" (:type content-block)) |
| 75 | + (let [function-name (:name content-block) |
| 76 | + function-args (:input-json content-block) |
| 77 | + response (on-tool-called {:name function-name |
| 78 | + :arguments (json/parse-string function-args)}) |
| 79 | + messages (concat messages |
| 80 | + [{:role "assistant" |
| 81 | + :content [(dissoc content-block :input-json)]}] |
| 82 | + (mapv |
| 83 | + (fn [{:keys [_type content]}] |
| 84 | + {:role "user" |
| 85 | + :content [{:type "tool_result" |
| 86 | + :tool_use_id (:id content-block) |
| 87 | + :content content}]}) |
| 88 | + (:contents response)))] |
| 89 | + (base-request! |
| 90 | + {:body (assoc body :messages messages) |
| 91 | + :api-key api-key |
| 92 | + :on-error on-error |
| 93 | + :on-response handle-response})))) |
| 94 | + "end_turn" (on-message-received {:finish-reason (-> data :delta :stop_reason)}) |
| 95 | + nil) |
66 | 96 | nil))] |
67 | 97 | (base-request! |
68 | 98 | {:body body |
|
0 commit comments