|
1 | 1 | (ns eca.handlers |
2 | 2 | (:require |
3 | | - [clojure.string :as string] |
4 | 3 | [eca.config :as config] |
5 | 4 | [eca.db :as db] |
6 | 5 | [eca.features.chat :as f.chat] |
7 | 6 | [eca.features.login :as f.login] |
8 | 7 | [eca.features.tools :as f.tools] |
9 | 8 | [eca.features.tools.mcp :as f.mcp] |
10 | | - [eca.llm-api :as llm-api] |
11 | 9 | [eca.logger :as logger] |
12 | 10 | [eca.messenger :as messenger] |
13 | 11 | [eca.models :as models] |
14 | 12 | [eca.shared :as shared])) |
15 | 13 |
|
16 | 14 | (set! *warn-on-reflection* true) |
17 | 15 |
|
18 | | -(defn ^:private sync-models! [db* config on-models-updated] |
19 | | - (let [all-models (models/all) |
20 | | - all-models (reduce |
21 | | - (fn [p [provider provider-config]] |
22 | | - (merge p |
23 | | - (reduce |
24 | | - (fn [m [model _model-config]] |
25 | | - (let [full-model (str provider "/" model) |
26 | | - model-capabilities (merge |
27 | | - (or (get all-models full-model) |
28 | | - ;; we guess the capabilities from |
29 | | - ;; the first model with same name |
30 | | - (when-let [found-full-model (first (filter #(= (shared/normalize-model-name model) |
31 | | - (shared/normalize-model-name (second (string/split % #"/" 2)))) |
32 | | - (keys all-models)))] |
33 | | - (get all-models found-full-model)) |
34 | | - {:tools true |
35 | | - :reason? true |
36 | | - :web-search true}))] |
37 | | - (assoc m full-model model-capabilities))) |
38 | | - {} |
39 | | - (:models provider-config)))) |
40 | | - {} |
41 | | - (:providers config)) |
42 | | - all-models (if-let [local-models (seq (llm-api/local-models config))] |
43 | | - (let [models (reduce |
44 | | - (fn [models {:keys [model] :as ollama-model}] |
45 | | - (assoc models |
46 | | - (str config/ollama-model-prefix model) |
47 | | - (select-keys ollama-model [:tools :reason?]))) |
48 | | - {} |
49 | | - local-models)] |
50 | | - (merge all-models models)) |
51 | | - all-models)] |
52 | | - (swap! db* assoc :models all-models) |
53 | | - (on-models-updated))) |
54 | | - |
55 | 16 | (defn initialize [{:keys [db*]} params] |
56 | 17 | (logger/logging-task |
57 | 18 | :eca/initialize |
|
63 | 24 | :workspace-folders (:workspace-folders params) |
64 | 25 | :client-capabilities (:capabilities params)) |
65 | 26 | (when-not (:pureConfig config) |
66 | | - (db/load-db-from-cache! db*)) |
| 27 | + (db/load-db-from-cache! db* config)) |
67 | 28 |
|
68 | 29 | ;; Deprecated |
69 | 30 | ;; For backward compatibility, |
70 | 31 | ;; we now return chat config via `config/updated` notification. |
71 | | - (sync-models! db* config (fn [])) |
| 32 | + (models/sync-models! db* config (fn [_])) |
72 | 33 | (let [db @db*] |
73 | 34 | {:models (sort (keys (:models db))) |
74 | 35 | :chat-default-model (f.chat/default-model db config) |
|
83 | 44 | (let [new-providers-hash (hash (:providers config))] |
84 | 45 | (when (not= (:providers-config-hash @db*) new-providers-hash) |
85 | 46 | (swap! db* assoc :providers-config-hash new-providers-hash) |
86 | | - (sync-models! db* config (fn [] |
| 47 | + (models/sync-models! db* config (fn [models] |
87 | 48 | (let [db @db*] |
88 | 49 | (config/notify-fields-changed-only! |
89 | 50 | {:chat |
90 | | - {:models (sort (keys (:models db))) |
| 51 | + {:models (sort (keys models)) |
91 | 52 | :default-model (f.chat/default-model db config) |
92 | 53 | :behaviors (:chat-behaviors db) |
93 | 54 | :default-behavior (or (:defaultBehavior (:chat config)) ;;legacy |
|
122 | 83 | (logger/logging-task |
123 | 84 | :eca/chat-prompt |
124 | 85 | (case (get-in @db* [:chats (:chat-id params) :status]) |
125 | | - :login (f.login/continue params db* messenger) |
| 86 | + :login (f.login/continue params db* messenger config) |
126 | 87 | (f.chat/prompt params db* messenger config)))) |
127 | 88 |
|
128 | 89 | (defn chat-query-context [{:keys [db* config]} params] |
|
0 commit comments