|
98 | 98 | [{:keys [model user-messages temperature instructions max-output-tokens |
99 | 99 | api-url api-key reason? reason-tokens past-messages tools web-search] |
100 | 100 | :or {temperature 1.0}} |
101 | | - {:keys [on-message-received on-error on-reason on-prepare-tool-call on-tool-called]}] |
| 101 | + {:keys [on-message-received on-error on-reason on-prepare-tool-call on-tool-called on-usage-updated]}] |
102 | 102 | (let [messages (concat (normalize-messages past-messages) |
103 | 103 | (normalize-messages user-messages)) |
104 | 104 | body (assoc-some |
|
150 | 150 | :external-id (-> data :delta :signature) |
151 | 151 | :id reason-id}) |
152 | 152 | nil) |
153 | | - "message_delta" (case (-> data :delta :stop_reason) |
154 | | - "tool_use" (doseq [content-block (vals @content-block*)] |
155 | | - (when (= "tool_use" (:type content-block)) |
156 | | - (let [function-name (:name content-block) |
157 | | - function-args (:input-json content-block) |
158 | | - {:keys [new-messages]} (on-tool-called {:id (:id content-block) |
159 | | - :name function-name |
160 | | - :arguments (json/parse-string function-args)}) |
161 | | - messages (-> (normalize-messages new-messages) |
162 | | - add-cache-to-last-message)] |
163 | | - (base-request! |
164 | | - {:rid (llm-util/gen-rid) |
165 | | - :body (assoc body :messages messages) |
166 | | - :api-url api-url |
167 | | - :api-key api-key |
168 | | - :content-block* (atom nil) |
169 | | - :on-error on-error |
170 | | - :on-response handle-response})))) |
171 | | - "end_turn" (do |
172 | | - (reset! content-block* {}) |
173 | | - (on-message-received {:type :finish |
174 | | - :usage {:input-tokens (-> data :usage :input_tokens) |
175 | | - :input-cache-creation-tokens (-> data :usage :cache_creation_input_tokens) |
176 | | - :input-cache-read-tokens (-> data :usage :cache_read_input_tokens) |
177 | | - :output-tokens (-> data :usage :output_tokens)} |
178 | | - :finish-reason (-> data :delta :stop_reason)})) |
179 | | - "max_tokens" (on-message-received {:type :limit-reached |
180 | | - :tokens (:usage data)}) |
181 | | - nil) |
| 153 | + "message_delta" (do |
| 154 | + (when-let [usage (and (-> data :delta :stop_reason) |
| 155 | + (:usage data))] |
| 156 | + (on-usage-updated {:input-tokens (:input_tokens usage) |
| 157 | + :input-cache-creation-tokens (:cache_creation_input_tokens usage) |
| 158 | + :input-cache-read-tokens (:cache_read_input_tokens usage) |
| 159 | + :output-tokens (:output_tokens usage)})) |
| 160 | + (case (-> data :delta :stop_reason) |
| 161 | + "tool_use" (doseq [content-block (vals @content-block*)] |
| 162 | + (when (= "tool_use" (:type content-block)) |
| 163 | + (let [function-name (:name content-block) |
| 164 | + function-args (:input-json content-block) |
| 165 | + {:keys [new-messages]} (on-tool-called {:id (:id content-block) |
| 166 | + :name function-name |
| 167 | + :arguments (json/parse-string function-args)}) |
| 168 | + messages (-> (normalize-messages new-messages) |
| 169 | + add-cache-to-last-message)] |
| 170 | + (base-request! |
| 171 | + {:rid (llm-util/gen-rid) |
| 172 | + :body (assoc body :messages messages) |
| 173 | + :api-url api-url |
| 174 | + :api-key api-key |
| 175 | + :content-block* (atom nil) |
| 176 | + :on-error on-error |
| 177 | + :on-response handle-response})))) |
| 178 | + "end_turn" (do |
| 179 | + (reset! content-block* {}) |
| 180 | + (on-message-received {:type :finish |
| 181 | + :finish-reason (-> data :delta :stop_reason)})) |
| 182 | + "max_tokens" (on-message-received {:type :limit-reached |
| 183 | + :tokens (:usage data)}) |
| 184 | + nil)) |
182 | 185 | nil))] |
183 | 186 | (base-request! |
184 | 187 | {:rid (llm-util/gen-rid) |
|
0 commit comments