|
59 | 59 | (fn [e] |
60 | 60 | (on-error {:exception e}))))) |
61 | 61 |
|
62 | | -(defn ^:private ->messages-with-history [past-messages user-prompt] |
63 | | - (conj (mapv (fn [{:keys [role content] :as msg}] |
64 | | - (case role |
65 | | - "tool_call" {:role "assistant" |
66 | | - :content [{:type "tool_use" |
67 | | - :id (:id content) |
68 | | - :name (:name content) |
69 | | - :input (or (:arguments content) {})}]} |
| 62 | +(defn ^:private past-messages->messages [past-messages] |
| 63 | + (mapv (fn [{:keys [role content] :as msg}] |
| 64 | + (case role |
| 65 | + "tool_call" {:role "assistant" |
| 66 | + :content [{:type "tool_use" |
| 67 | + :id (:id content) |
| 68 | + :name (:name content) |
| 69 | + :input (or (:arguments content) {})}]} |
70 | 70 |
|
71 | | - "tool_call_output" |
72 | | - {:role "user" |
73 | | - :content [{:type "tool_result" |
74 | | - :tool_use_id (:id content) |
75 | | - :content (llm-util/stringfy-tool-result content)}]} |
76 | | - msg)) |
77 | | - past-messages) |
78 | | - ;; TODO add cache_control to last non thinking message |
79 | | - {:role "user" :content [{:type :text |
80 | | - :text user-prompt}]})) |
| 71 | + "tool_call_output" |
| 72 | + {:role "user" |
| 73 | + :content [{:type "tool_result" |
| 74 | + :tool_use_id (:id content) |
| 75 | + :content (llm-util/stringfy-tool-result content)}]} |
| 76 | + msg)) |
| 77 | + past-messages)) |
81 | 78 |
|
82 | 79 | (defn ^:private add-cache-to-last-message [messages] |
| 80 | + ;; TODO add cache_control to last non thinking message |
83 | 81 | (shared/update-last |
84 | 82 | (vec messages) |
85 | 83 | #(assoc-in % [:content 0 :cache_control] {:type "ephemeral"}))) |
86 | 84 |
|
87 | 85 | (defn completion! |
88 | 86 | [{:keys [model user-prompt temperature context max-tokens |
89 | 87 | api-key past-messages tools web-search] |
90 | | - :or {max-tokens 1024 |
| 88 | + :or {max-tokens 4096 |
91 | 89 | temperature 1.0}} |
92 | 90 | {:keys [on-message-received on-error on-prepare-tool-call on-tool-called]}] |
93 | | - (let [messages (->messages-with-history past-messages user-prompt) |
| 91 | + (let [messages (conj (past-messages->messages past-messages) |
| 92 | + {:role "user" :content [{:type :text |
| 93 | + :text user-prompt}]}) |
94 | 94 | body {:model model |
95 | 95 | :messages (add-cache-to-last-message messages) |
96 | 96 | :max_tokens max-tokens |
|
131 | 131 | (when (= "tool_use" (:type content-block)) |
132 | 132 | (let [function-name (:name content-block) |
133 | 133 | function-args (:input-json content-block) |
134 | | - response (on-tool-called {:id (:id content-block) |
135 | | - :name function-name |
136 | | - :arguments (json/parse-string function-args)}) |
137 | | - messages (-> (concat messages |
| 134 | + {:keys [result past-messages]} (on-tool-called {:id (:id content-block) |
| 135 | + :name function-name |
| 136 | + :arguments (json/parse-string function-args)}) |
| 137 | + messages (-> (concat (past-messages->messages past-messages) |
138 | 138 | [{:role "assistant" |
139 | 139 | :content [(dissoc content-block :input-json)]}] |
140 | 140 | (mapv |
|
143 | 143 | :content [{:type "tool_result" |
144 | 144 | :tool_use_id (:id content-block) |
145 | 145 | :content content}]}) |
146 | | - (:contents response))) |
| 146 | + (:contents result))) |
147 | 147 | add-cache-to-last-message)] |
148 | 148 | (base-request! |
149 | 149 | {:rid (llm-util/gen-rid) |
|
0 commit comments