|
65 | 65 | (send-content! chat-ctx :system |
66 | 66 | {:type :progress |
67 | 67 | :state :finished}) |
| 68 | + (when-not (get-in @db* [:chats chat-id :created-at]) |
| 69 | + (swap! db* assoc-in [:chats chat-id :created-at] (System/currentTimeMillis))) |
68 | 70 | (when on-finished-side-effect |
69 | 71 | (on-finished-side-effect)) |
70 | 72 | (db/update-workspaces-cache! @db* metrics)) |
|
569 | 571 | (swap! db* assoc-in [:chats chat-id :title] title) |
570 | 572 | (send-content! chat-ctx :system (assoc-some |
571 | 573 | {:type :metadata} |
572 | | - :title title)))))) |
| 574 | + :title title)) |
| 575 | + ;; user prompt responded faster than title was generated |
| 576 | + (when (= :idle (get-in @db* [:chats chat-id :status])) |
| 577 | + (db/update-workspaces-cache! @db* metrics)))))) |
573 | 578 | (send-content! chat-ctx :system {:type :progress |
574 | 579 | :state :running |
575 | 580 | :text "Waiting model"}) |
|
696 | 701 | (partial get-tool-call-state @db* chat-id id) |
697 | 702 | (partial transition-tool-call! db* chat-ctx id)) |
698 | 703 | details (f.tools/tool-call-details-after-invocation name arguments details result) |
699 | | - {:keys [start-time]} (get-tool-call-state @db* chat-id id)] |
| 704 | + {:keys [start-time]} (get-tool-call-state @db* chat-id id) |
| 705 | + total-time-ms (- (System/currentTimeMillis) start-time)] |
700 | 706 | (add-to-history! {:role "tool_call" |
701 | 707 | :content (assoc tool-call |
702 | 708 | :details details |
|
707 | 713 | :content (assoc tool-call |
708 | 714 | :error (:error result) |
709 | 715 | :output result |
| 716 | + :total-time-ms total-time-ms |
710 | 717 | :details details |
711 | 718 | :summary summary |
712 | 719 | :origin origin |
|
722 | 729 | :arguments arguments |
723 | 730 | :error (:error result) |
724 | 731 | :outputs (:contents result) |
725 | | - :total-time-ms (- (System/currentTimeMillis) start-time) |
| 732 | + :total-time-ms total-time-ms |
726 | 733 | :progress-text "Generating" |
727 | 734 | :details details |
728 | 735 | :summary summary}) |
|
733 | 740 | :arguments arguments |
734 | 741 | :error (:error result) |
735 | 742 | :outputs (:contents result) |
736 | | - :total-time-ms (- (System/currentTimeMillis) start-time) |
| 743 | + :total-time-ms total-time-ms |
737 | 744 | :reason :user-stop |
738 | 745 | :details details |
739 | 746 | :summary summary}) |
|
834 | 841 | {:type :reasonText |
835 | 842 | :id id |
836 | 843 | :text text})) |
837 | | - :finished (do |
| 844 | + :finished (let [total-time-ms (- (System/currentTimeMillis) (get-in @reasonings* [id :start-time]))] |
838 | 845 | (add-to-history! {:role "reason" :content {:id id |
839 | 846 | :external-id external-id |
| 847 | + :total-time-ms total-time-ms |
840 | 848 | :text (get-in @reasonings* [id :text])}}) |
841 | 849 | (send-content! chat-ctx :assistant |
842 | 850 | {:type :reasonFinished |
843 | | - :total-time-ms (- (System/currentTimeMillis) (get-in @reasonings* [id :start-time])) |
| 851 | + :total-time-ms total-time-ms |
844 | 852 | :id id})) |
845 | 853 | nil)) |
846 | 854 | :on-error (fn [{:keys [message exception]}] |
|
865 | 873 | (case role |
866 | 874 | ("user" |
867 | 875 | "system" |
868 | | - "assistant") (reduce |
869 | | - (fn [m content] |
870 | | - (case (:type content) |
871 | | - :text (assoc m |
872 | | - :type :text |
873 | | - :text (str (:text m) "\n" (:text content))) |
874 | | - m)) |
875 | | - {} |
876 | | - message-content) |
877 | | - "tool_call" {:type :toolCallPrepare |
878 | | - :origin (:origin message-content) |
879 | | - :name (:name message-content) |
880 | | - :server (:server message-content) |
881 | | - :arguments-text "" |
882 | | - :id (:id message-content)} |
883 | | - "tool_call_output" {:type :toolCalled |
884 | | - :origin (:origin message-content) |
885 | | - :name (:name message-content) |
886 | | - :server (:server message-content) |
887 | | - :arguments (:arguments message-content) |
888 | | - :error (:error message-content) |
889 | | - :id (:id message-content) |
890 | | - :outputs (:contents (:output message-content))} |
891 | | - "reason" {:id (:id message-content) |
892 | | - :external-id (:external-id message-content) |
893 | | - :text (:text message-content)})) |
| 876 | + "assistant") [(reduce |
| 877 | + (fn [m content] |
| 878 | + (case (:type content) |
| 879 | + :text (assoc m |
| 880 | + :type :text |
| 881 | + :text (str (:text m) "\n" (:text content))) |
| 882 | + m)) |
| 883 | + {} |
| 884 | + message-content)] |
| 885 | + "tool_call" [{:type :toolCallPrepare |
| 886 | + :origin (:origin message-content) |
| 887 | + :name (:name message-content) |
| 888 | + :server (:server message-content) |
| 889 | + :arguments-text "" |
| 890 | + :id (:id message-content)}] |
| 891 | + "tool_call_output" [{:type :toolCalled |
| 892 | + :origin (:origin message-content) |
| 893 | + :name (:name message-content) |
| 894 | + :server (:server message-content) |
| 895 | + :arguments (:arguments message-content) |
| 896 | + :total-time-ms (:total-time-ms message-content) |
| 897 | + :error (:error message-content) |
| 898 | + :id (:id message-content) |
| 899 | + :outputs (:contents (:output message-content))}] |
| 900 | + "reason" [{:type :reasonStarted |
| 901 | + :id (:id message-content)} |
| 902 | + {:type :reasonText |
| 903 | + :id (:id message-content) |
| 904 | + :text (:text message-content)} |
| 905 | + {:type :reasonFinished |
| 906 | + :id (:id message-content) |
| 907 | + :total-time-ms (:total-time-ms message-content)}])) |
894 | 908 |
|
895 | 909 | (defn ^:private handle-command! [{:keys [command args]} chat-ctx] |
896 | 910 | (let [{:keys [type on-finished-side-effect] :as result} (f.commands/handle-command! command args chat-ctx)] |
897 | 911 | (case type |
898 | 912 | :chat-messages (do |
899 | | - (doseq [[chat-id messages] (:chats result)] |
| 913 | + (doseq [[chat-id {:keys [messages title]}] (:chats result)] |
900 | 914 | (doseq [message messages] |
901 | | - (send-content! (assoc chat-ctx :chat-id chat-id) |
902 | | - (:role message) |
903 | | - (message-content->chat-content (:role message) (:content message))))) |
| 915 | + (let [new-chat-ctx (assoc chat-ctx :chat-id chat-id)] |
| 916 | + (doseq [chat-content (message-content->chat-content (:role message) (:content message))] |
| 917 | + (send-content! new-chat-ctx |
| 918 | + (:role message) |
| 919 | + chat-content)) |
| 920 | + (when title |
| 921 | + (send-content! new-chat-ctx :system (assoc-some |
| 922 | + {:type :metadata} |
| 923 | + :title title)))))) |
904 | 924 | (finish-chat-prompt! :idle chat-ctx)) |
905 | 925 | :new-chat-status (finish-chat-prompt! (:status result) chat-ctx) |
906 | 926 | :send-prompt (prompt-messages! [{:role "user" :content (:prompt result)}] (assoc chat-ctx :on-finished-side-effect on-finished-side-effect)) |
|
0 commit comments