Browse Source

feat: #112 add edit chat title

Yifei Zhang 1 year ago
parent
commit
45088a3e06
7 changed files with 40 additions and 14 deletions
  1. 5 5
      .lintstagedrc.json
  2. 8 0
      app/components/home.module.scss
  3. 11 1
      app/components/home.tsx
  4. 2 1
      app/locales/cn.ts
  5. 2 1
      app/locales/en.ts
  6. 1 0
      app/locales/tw.ts
  7. 11 6
      app/store/app.ts

+ 5 - 5
.lintstagedrc.json

@@ -1,6 +1,6 @@
 {
-    "./app/**/*.{js,ts,jsx,tsx,json,html,css,scss,md}": [
-      "eslint --fix",
-      "prettier --write"
-    ]
-}
+  "./app/**/*.{js,ts,jsx,tsx,json,html,css,md}": [
+    "eslint --fix",
+    "prettier --write"
+  ]
+}

+ 8 - 0
app/components/home.module.scss

@@ -221,6 +221,14 @@
   margin-bottom: 100px;
 }
 
+.chat-body-title {
+  cursor: pointer;
+
+  &:hover {
+    text-decoration: underline;
+  }
+}
+
 .chat-message {
   display: flex;
   flex-direction: row;

+ 11 - 1
app/components/home.tsx

@@ -333,7 +333,17 @@ export function Chat(props: {
           className={styles["window-header-title"]}
           onClick={props?.showSideBar}
         >
-          <div className={styles["window-header-main-title"]}>
+          <div
+            className={`${styles["window-header-main-title"]} ${styles["chat-body-title"]}`}
+            onClick={() => {
+              const newTopic = prompt(Locale.Chat.Rename, session.topic);
+              if (newTopic && newTopic !== session.topic) {
+                chatStore.updateCurrentSession(
+                  (session) => (session.topic = newTopic!),
+                );
+              }
+            }}
+          >
             {session.topic}
           </div>
           <div className={styles["window-header-sub-title"]}>

+ 2 - 1
app/locales/cn.ts

@@ -18,6 +18,7 @@ const cn = {
       Stop: "停止",
       Retry: "重试",
     },
+    Rename: "重命名对话",
     Typing: "正在输入…",
     Input: (submitKey: string) => {
       var inputHints = `输入消息,${submitKey} 发送`;
@@ -124,7 +125,7 @@ const cn = {
       History: (content: string) =>
         "这是 ai 和用户的历史聊天总结作为前情提要:" + content,
       Topic:
-        "直接返回这句话的简要主题,不要解释,如果没有主题,请直接返回“闲聊”",
+        "使用四到五个字直接返回这句话的简要主题,不要解释、不要标点、不要语气词、不要多余文本,如果没有主题,请直接返回“闲聊”",
       Summarize:
         "简要总结一下你和用户的对话,用作后续的上下文提示 prompt,控制在 50 字以内",
     },

+ 2 - 1
app/locales/en.ts

@@ -20,6 +20,7 @@ const en: LocaleType = {
       Stop: "Stop",
       Retry: "Retry",
     },
+    Rename: "Rename Chat",
     Typing: "Typing…",
     Input: (submitKey: string) => {
       var inputHints = `Type something and press ${submitKey} to send`;
@@ -129,7 +130,7 @@ const en: LocaleType = {
         "This is a summary of the chat history between the AI and the user as a recap: " +
         content,
       Topic:
-        "Provide a brief topic of the sentence without explanation. If there is no topic, return 'Chitchat'.",
+        "Please generate a four to five word title summarizing our conversation without any lead-in, punctuation, quotation marks, periods, symbols, or additional text. Remove enclosing quotation marks.",
       Summarize:
         "Summarize our discussion briefly in 50 characters or less to use as a prompt for future context.",
     },

+ 1 - 0
app/locales/tw.ts

@@ -19,6 +19,7 @@ const tw: LocaleType = {
       Stop: "停止",
       Retry: "重試",
     },
+    Rename: "重命名對話",
     Typing: "正在輸入…",
     Input: (submitKey: string) => {
       var inputHints = `輸入訊息後,按下 ${submitKey} 鍵即可發送`;

+ 11 - 6
app/store/app.ts

@@ -206,6 +206,10 @@ interface ChatStore {
   clearAllData: () => void;
 }
 
+function countMessages(msgs: Message[]) {
+  return msgs.reduce((pre, cur) => pre + cur.content.length, 0);
+}
+
 const LOCAL_KEY = "chat-next-web-store";
 
 export const useChatStore = create<ChatStore>()(
@@ -393,8 +397,12 @@ export const useChatStore = create<ChatStore>()(
       summarizeSession() {
         const session = get().currentSession();
 
-        if (session.topic === DEFAULT_TOPIC && session.messages.length >= 3) {
-          // should summarize topic
+        // should summarize topic after chating more than 50 words
+        const SUMMARIZE_MIN_LEN = 50;
+        if (
+          session.topic === DEFAULT_TOPIC &&
+          countMessages(session.messages) >= SUMMARIZE_MIN_LEN
+        ) {
           requestWithPrompt(session.messages, Locale.Store.Prompt.Topic).then(
             (res) => {
               get().updateCurrentSession(
@@ -408,10 +416,7 @@ export const useChatStore = create<ChatStore>()(
         let toBeSummarizedMsgs = session.messages.slice(
           session.lastSummarizeIndex,
         );
-        const historyMsgLength = toBeSummarizedMsgs.reduce(
-          (pre, cur) => pre + cur.content.length,
-          0,
-        );
+        const historyMsgLength = countMessages(toBeSummarizedMsgs);
 
         if (historyMsgLength > 4000) {
           toBeSummarizedMsgs = toBeSummarizedMsgs.slice(