|
61 | 61 | ollama-model |
62 | 62 | (:default-model db))) |
63 | 63 |
|
64 | | -(defn ^:private assert-chat-not-stopped! [chat-id request-id db* messenger] |
| 64 | +(defn finish-chat-prompt! [chat-id status messenger db*] |
| 65 | + (swap! db* assoc-in [:chats chat-id :status] status) |
| 66 | + (messenger/chat-content-received |
| 67 | + messenger |
| 68 | + {:chat-id chat-id |
| 69 | + :request-id (get-in @db* [:chats chat-id :current-request-id]) |
| 70 | + :role :system |
| 71 | + :content {:type :progress |
| 72 | + :state :finished}})) |
| 73 | + |
| 74 | +(defn ^:private assert-chat-not-stopped! [chat-id db* messenger] |
65 | 75 | (when (identical? :stoping (get-in @db* [:chats chat-id :status])) |
| 76 | + (finish-chat-prompt! chat-id :idle messenger db*) |
66 | 77 | (logger/info logger-tag "Chat prompt stopped:" chat-id) |
67 | | - (messenger/chat-content-received |
68 | | - messenger |
69 | | - {:chat-id chat-id |
70 | | - :request-id request-id |
71 | | - :role :system |
72 | | - :content {:type :progress |
73 | | - :state :finished}}) |
74 | | - (swap! db* assoc-in [:chats chat-id :status] :idle) |
75 | 78 | (throw (ex-info "Chat prompt stopped" {:silent? true |
76 | 79 | :chat-id chat-id})))) |
77 | 80 |
|
|
82 | 85 | config] |
83 | 86 | (let [chat-id (or chat-id |
84 | 87 | (let [new-id (str (random-uuid))] |
85 | | - (swap! db* assoc-in [:chats new-id] {:id new-id |
86 | | - :status :running}) |
| 88 | + (swap! db* assoc-in [:chats new-id] {:id new-id}) |
87 | 89 | new-id)) |
88 | 90 | _ (swap! db* assoc-in [:chats chat-id :current-request-id] request-id) |
| 91 | + _ (swap! db* assoc-in [:chats chat-id :status] :running) |
89 | 92 | _ (messenger/chat-content-received |
90 | 93 | messenger |
91 | 94 | {:chat-id chat-id |
|
132 | 135 | :config config |
133 | 136 | :tools all-tools |
134 | 137 | :on-first-message-received (fn [_] |
135 | | - (assert-chat-not-stopped! chat-id request-id db* messenger) |
| 138 | + (assert-chat-not-stopped! chat-id db* messenger) |
136 | 139 | (add-to-history! {:role "user" :content user-prompt}) |
137 | 140 | (messenger/chat-content-received |
138 | 141 | messenger |
|
143 | 146 | :state :running |
144 | 147 | :text "Generating"}})) |
145 | 148 | :on-message-received (fn [{:keys [type] :as msg}] |
146 | | - (assert-chat-not-stopped! chat-id request-id db* messenger) |
| 149 | + (assert-chat-not-stopped! chat-id db* messenger) |
147 | 150 | (case type |
148 | 151 | :text (do |
149 | 152 | (swap! received-msgs* str (:text msg)) |
|
164 | 167 | :url (:url msg)}}) |
165 | 168 | :finish (do |
166 | 169 | (add-to-history! {:role "assistant" :content @received-msgs*}) |
167 | | - (swap! db* assoc-in [:chats chat-id :status] :idle) |
168 | | - (messenger/chat-content-received |
169 | | - messenger |
170 | | - {:chat-id chat-id |
171 | | - :request-id request-id |
172 | | - :role :system |
173 | | - :content {:type :progress |
174 | | - :state :finished}})))) |
| 170 | + (finish-chat-prompt! chat-id :idle messenger db*)))) |
175 | 171 | :on-prepare-tool-call (fn [{:keys [id name argument]}] |
176 | | - (assert-chat-not-stopped! chat-id request-id db* messenger) |
| 172 | + (assert-chat-not-stopped! chat-id db* messenger) |
177 | 173 | (messenger/chat-content-received |
178 | 174 | messenger |
179 | 175 | {:chat-id chat-id |
|
185 | 181 | :id id |
186 | 182 | :manual-approval false}})) |
187 | 183 | :on-tool-called (fn [{:keys [id name arguments] :as tool-call}] |
188 | | - (assert-chat-not-stopped! chat-id request-id db* messenger) |
| 184 | + (assert-chat-not-stopped! chat-id db* messenger) |
189 | 185 | (messenger/chat-content-received |
190 | 186 | messenger |
191 | 187 | {:chat-id chat-id |
|
214 | 210 | :outputs (:contents result)}}) |
215 | 211 | result)) |
216 | 212 | :on-reason (fn [{:keys [status]}] |
217 | | - (assert-chat-not-stopped! chat-id request-id db* messenger) |
| 213 | + (assert-chat-not-stopped! chat-id db* messenger) |
218 | 214 | (let [msg (case status |
219 | 215 | :started "Reasoning" |
220 | 216 | :finished "Waiting model" |
|
228 | 224 | :state :running |
229 | 225 | :text msg}}))) |
230 | 226 | :on-error (fn [{:keys [message exception]}] |
231 | | - (swap! db* assoc-in [:chats chat-id :status] :idle) |
232 | 227 | (messenger/chat-content-received |
233 | 228 | messenger |
234 | 229 | {:chat-id chat-id |
235 | 230 | :request-id request-id |
236 | 231 | :role :system |
237 | 232 | :content {:type :text |
238 | 233 | :text (or message (ex-message exception))}}) |
239 | | - (messenger/chat-content-received |
240 | | - messenger |
241 | | - {:chat-id chat-id |
242 | | - :request-id request-id |
243 | | - :role :system |
244 | | - :content {:type :progress |
245 | | - :state :finished}}))}) |
| 234 | + (finish-chat-prompt! chat-id :idle messenger db*))}) |
246 | 235 | {:chat-id chat-id |
247 | 236 | :model chosen-model |
248 | 237 | :status :success})) |
|
280 | 269 | (set contexts))})) |
281 | 270 | (defn prompt-stop |
282 | 271 | [{:keys [chat-id]} db* messenger] |
283 | | - (let [request-id (get-in @db* [:chats chat-id :current-request-id])] |
284 | | - (swap! db* assoc-in [:chats chat-id :status] :stoping) |
285 | | - (messenger/chat-content-received |
286 | | - messenger |
287 | | - {:chat-id chat-id |
288 | | - :request-id request-id |
289 | | - :role :system |
290 | | - :content {:type :text |
291 | | - :text "Prompt stopped"}}) |
292 | | - (messenger/chat-content-received |
293 | | - messenger |
294 | | - {:chat-id chat-id |
295 | | - :request-id request-id |
296 | | - :role :system |
297 | | - :content {:type :progress |
298 | | - :state :finished}}))) |
| 272 | + (when (identical? :running (get-in @db* [:chats chat-id :status])) |
| 273 | + (let [request-id (get-in @db* [:chats chat-id :current-request-id])] |
| 274 | + (messenger/chat-content-received |
| 275 | + messenger |
| 276 | + {:chat-id chat-id |
| 277 | + :request-id request-id |
| 278 | + :role :system |
| 279 | + :content {:type :text |
| 280 | + :text "\nPrompt stopped"}}) |
| 281 | + (finish-chat-prompt! chat-id :stoping messenger db*)))) |
0 commit comments