|
151 | 151 | :details (:details message-content) |
152 | 152 | :arguments-text "" |
153 | 153 | :id (:id message-content)}}] |
154 | | - "tool_call_output" [{:role :assistant |
155 | | - :content (assoc-some |
156 | | - {:type :toolCallRun |
157 | | - :id (:id message-content) |
158 | | - :name (:name message-content) |
159 | | - :server (:server message-content) |
160 | | - :origin (:origin message-content) |
161 | | - :arguments (:arguments message-content)} |
162 | | - :details (:details message-content) |
163 | | - :summary (:summary message-content))} |
164 | | - {:role :assistant |
165 | | - :content (assoc-some |
166 | | - {:type :toolCallRunning |
167 | | - :id (:id message-content) |
168 | | - :name (:name message-content) |
169 | | - :server (:server message-content) |
170 | | - :origin (:origin message-content) |
171 | | - :arguments (:arguments message-content)} |
172 | | - :details (:details message-content) |
173 | | - :summary (:summary message-content))} |
174 | | - {:role :assistant |
175 | | - :content {:type :toolCalled |
176 | | - :origin (:origin message-content) |
177 | | - :name (:name message-content) |
178 | | - :server (:server message-content) |
179 | | - :arguments (:arguments message-content) |
180 | | - :total-time-ms (:total-time-ms message-content) |
181 | | - :summary (:summary message-content) |
182 | | - :details (:details message-content) |
183 | | - :error (:error message-content) |
184 | | - :id (:id message-content) |
185 | | - :outputs (:contents (:output message-content))}}] |
| 154 | + ;; Mirror the live path in tool-calls.clj :send-toolCalled: split image |
| 155 | + ;; outputs out of the toolCalled :outputs (which is text-only per |
| 156 | + ;; protocol) and re-emit them as standalone ChatImageContent entries so |
| 157 | + ;; reopened/resumed chats render MCP-produced images at the same point |
| 158 | + ;; they appeared live. |
| 159 | + "tool_call_output" (let [contents (:contents (:output message-content)) |
| 160 | + image? #(and (map? %) (= :image (:type %))) |
| 161 | + ;; Only partition when contents is a sequence of content |
| 162 | + ;; maps that includes images; otherwise pass through. |
| 163 | + image-outputs (when (sequential? contents) (filter image? contents)) |
| 164 | + text-outputs (if (seq image-outputs) |
| 165 | + (vec (remove image? contents)) |
| 166 | + contents)] |
| 167 | + (into [{:role :assistant |
| 168 | + :content (assoc-some |
| 169 | + {:type :toolCallRun |
| 170 | + :id (:id message-content) |
| 171 | + :name (:name message-content) |
| 172 | + :server (:server message-content) |
| 173 | + :origin (:origin message-content) |
| 174 | + :arguments (:arguments message-content)} |
| 175 | + :details (:details message-content) |
| 176 | + :summary (:summary message-content))} |
| 177 | + {:role :assistant |
| 178 | + :content (assoc-some |
| 179 | + {:type :toolCallRunning |
| 180 | + :id (:id message-content) |
| 181 | + :name (:name message-content) |
| 182 | + :server (:server message-content) |
| 183 | + :origin (:origin message-content) |
| 184 | + :arguments (:arguments message-content)} |
| 185 | + :details (:details message-content) |
| 186 | + :summary (:summary message-content))} |
| 187 | + {:role :assistant |
| 188 | + :content {:type :toolCalled |
| 189 | + :origin (:origin message-content) |
| 190 | + :name (:name message-content) |
| 191 | + :server (:server message-content) |
| 192 | + :arguments (:arguments message-content) |
| 193 | + :total-time-ms (:total-time-ms message-content) |
| 194 | + :summary (:summary message-content) |
| 195 | + :details (:details message-content) |
| 196 | + :error (:error message-content) |
| 197 | + :id (:id message-content) |
| 198 | + :outputs text-outputs}}] |
| 199 | + (map (fn [img] |
| 200 | + {:role :assistant |
| 201 | + :content {:type :image |
| 202 | + :media-type (:media-type img) |
| 203 | + :base64 (:base64 img)}})) |
| 204 | + image-outputs)) |
186 | 205 | "image_generation_call" [{:role :assistant |
187 | 206 | :content {:type :image |
188 | 207 | :media-type (:media-type message-content) |
|
0 commit comments