+
+ Chat feature is in beta. For best results, we recommend you to use{" "}
+
+ custom endpoints
+
+ .
+
+
+
+
);
diff --git a/apps/desktop/src/components/toolbar/bars/main-toolbar.tsx b/apps/desktop/src/components/toolbar/bars/main-toolbar.tsx
index da75ad629..2d2d41d6c 100644
--- a/apps/desktop/src/components/toolbar/bars/main-toolbar.tsx
+++ b/apps/desktop/src/components/toolbar/bars/main-toolbar.tsx
@@ -1,4 +1,3 @@
-import { useQuery } from "@tanstack/react-query";
import { useMatch } from "@tanstack/react-router";
import { DeleteNoteButton } from "@/components/toolbar/buttons/delete-note-button";
@@ -6,7 +5,6 @@ import { NewNoteButton } from "@/components/toolbar/buttons/new-note-button";
import { NewWindowButton } from "@/components/toolbar/buttons/new-window-button";
import { ShareButton } from "@/components/toolbar/buttons/share-button";
import { useLeftSidebar } from "@/contexts";
-import { commands as flagsCommands } from "@hypr/plugin-flags";
import { getCurrentWebviewWindowLabel } from "@hypr/plugin-windows";
import { cn } from "@hypr/ui/lib/utils";
import { SearchBar } from "../../search-bar";
@@ -26,11 +24,6 @@ export function MainToolbar() {
const isNote = !!noteMatch;
const isMain = getCurrentWebviewWindowLabel() === "main";
- const noteChatQuery = useQuery({
- queryKey: ["flags", "ChatRightPanel"],
- queryFn: () => flagsCommands.isEnabled("ChatRightPanel"),
- });
-
return (
{(organizationMatch || humanMatch) && }
- {noteChatQuery.data && }
+
>
)}
diff --git a/apps/desktop/src/components/toolbar/buttons/transcript-panel-button.tsx b/apps/desktop/src/components/toolbar/buttons/transcript-panel-button.tsx
index 5f4c0445e..eb297cac4 100644
--- a/apps/desktop/src/components/toolbar/buttons/transcript-panel-button.tsx
+++ b/apps/desktop/src/components/toolbar/buttons/transcript-panel-button.tsx
@@ -8,12 +8,14 @@ import { cn } from "@hypr/ui/lib/utils";
import Shortcut from "../../shortcut";
export function TranscriptPanelButton() {
- const { isExpanded, togglePanel } = useRightPanel();
+ const { isExpanded, currentView, togglePanel } = useRightPanel();
const handleClick = () => {
togglePanel("transcript");
};
+ const isActive = isExpanded && currentView === "transcript";
+
return (
@@ -23,7 +25,7 @@ export function TranscriptPanelButton() {
onClick={handleClick}
className={cn(
"hover:bg-neutral-300 text-xs",
- isExpanded && "bg-neutral-200",
+ isActive && "bg-neutral-200",
)}
>
diff --git a/apps/desktop/src/locales/en/messages.po b/apps/desktop/src/locales/en/messages.po
index 7db2db91b..a43eb64f6 100644
--- a/apps/desktop/src/locales/en/messages.po
+++ b/apps/desktop/src/locales/en/messages.po
@@ -368,7 +368,7 @@ msgstr "Are you sure you want to delete this note?"
msgid "Ask questions about past meetings"
msgstr "Ask questions about past meetings"
-#: src/components/right-panel/components/chat/chat-message.tsx:18
+#: src/components/right-panel/components/chat/chat-message.tsx:22
msgid "Assistant:"
msgstr "Assistant:"
@@ -422,6 +422,18 @@ msgstr "Cancel"
msgid "CEO"
msgstr "CEO"
+#: src/components/right-panel/components/chat/empty-chat-state.tsx:43
+msgid "Chat feature is in beta. For best results, we recommend you to use <0>custom endpoints0>."
+msgstr "Chat feature is in beta. For best results, we recommend you to use <0>custom endpoints0>."
+
+#: src/components/right-panel/components/chat/empty-chat-state.tsx:34
+msgid "Chat with meeting notes"
+msgstr "Chat with meeting notes"
+
+#: src/components/right-panel/components/chat/empty-chat-state.tsx:26
+#~ msgid "Chat with your meeting notes"
+#~ msgstr "Chat with your meeting notes"
+
#: src/components/settings/views/general.tsx:185
#~ msgid "Choose the language you want to use for the speech-to-text model and language model"
#~ msgstr "Choose the language you want to use for the speech-to-text model and language model"
@@ -501,7 +513,7 @@ msgstr "Control how creative the AI enhancement should be"
msgid "Create"
msgstr "Create"
-#: src/components/right-panel/components/chat/empty-chat-state.tsx:49
+#: src/components/right-panel/components/chat/empty-chat-state.tsx:79
msgid "Create agenda"
msgstr "Create agenda"
@@ -628,7 +640,7 @@ msgstr "Enter the base URL for your custom LLM endpoint"
msgid "Extensions"
msgstr "Extensions"
-#: src/components/right-panel/components/chat/empty-chat-state.tsx:43
+#: src/components/right-panel/components/chat/empty-chat-state.tsx:73
msgid "Extract action items"
msgstr "Extract action items"
@@ -706,8 +718,8 @@ msgid "Hmm... this is off..."
msgstr "Hmm... this is off..."
#: src/components/right-panel/components/chat/empty-chat-state.tsx:24
-msgid "How can I help you today?"
-msgstr "How can I help you today?"
+#~ msgid "How can I help you today?"
+#~ msgstr "How can I help you today?"
#: src/components/individualization-modal/how-heard-view.tsx:38
msgid "How did you hear about Hyprnote?"
@@ -743,7 +755,7 @@ msgstr "Job title"
msgid "Join meeting"
msgstr "Join meeting"
-#: src/components/right-panel/components/chat/empty-chat-state.tsx:37
+#: src/components/right-panel/components/chat/empty-chat-state.tsx:67
msgid "Key decisions"
msgstr "Key decisions"
@@ -1113,7 +1125,7 @@ msgstr "Stop"
msgid "Submit Feedback"
msgstr "Submit Feedback"
-#: src/components/right-panel/components/chat/empty-chat-state.tsx:31
+#: src/components/right-panel/components/chat/empty-chat-state.tsx:61
msgid "Summarize meeting"
msgstr "Summarize meeting"
@@ -1183,7 +1195,7 @@ msgstr "Toggle chat panel"
msgid "Toggle left sidebar"
msgstr "Toggle left sidebar"
-#: src/components/toolbar/buttons/transcript-panel-button.tsx:34
+#: src/components/toolbar/buttons/transcript-panel-button.tsx:36
msgid "Toggle widget panel"
msgstr "Toggle widget panel"
@@ -1235,7 +1247,7 @@ msgstr "Upgrade"
msgid "User"
msgstr "User"
-#: src/components/right-panel/components/chat/chat-message.tsx:18
+#: src/components/right-panel/components/chat/chat-message.tsx:22
msgid "User:"
msgstr "User:"
diff --git a/apps/desktop/src/locales/ko/messages.po b/apps/desktop/src/locales/ko/messages.po
index 4ebfaec1b..05a7b1242 100644
--- a/apps/desktop/src/locales/ko/messages.po
+++ b/apps/desktop/src/locales/ko/messages.po
@@ -368,7 +368,7 @@ msgstr ""
msgid "Ask questions about past meetings"
msgstr ""
-#: src/components/right-panel/components/chat/chat-message.tsx:18
+#: src/components/right-panel/components/chat/chat-message.tsx:22
msgid "Assistant:"
msgstr ""
@@ -422,6 +422,18 @@ msgstr ""
msgid "CEO"
msgstr ""
+#: src/components/right-panel/components/chat/empty-chat-state.tsx:43
+msgid "Chat feature is in beta. For best results, we recommend you to use <0>custom endpoints0>."
+msgstr ""
+
+#: src/components/right-panel/components/chat/empty-chat-state.tsx:34
+msgid "Chat with meeting notes"
+msgstr ""
+
+#: src/components/right-panel/components/chat/empty-chat-state.tsx:26
+#~ msgid "Chat with your meeting notes"
+#~ msgstr ""
+
#: src/components/settings/views/general.tsx:185
#~ msgid "Choose the language you want to use for the speech-to-text model and language model"
#~ msgstr ""
@@ -501,7 +513,7 @@ msgstr ""
msgid "Create"
msgstr ""
-#: src/components/right-panel/components/chat/empty-chat-state.tsx:49
+#: src/components/right-panel/components/chat/empty-chat-state.tsx:79
msgid "Create agenda"
msgstr ""
@@ -628,7 +640,7 @@ msgstr ""
msgid "Extensions"
msgstr ""
-#: src/components/right-panel/components/chat/empty-chat-state.tsx:43
+#: src/components/right-panel/components/chat/empty-chat-state.tsx:73
msgid "Extract action items"
msgstr ""
@@ -706,8 +718,8 @@ msgid "Hmm... this is off..."
msgstr ""
#: src/components/right-panel/components/chat/empty-chat-state.tsx:24
-msgid "How can I help you today?"
-msgstr ""
+#~ msgid "How can I help you today?"
+#~ msgstr ""
#: src/components/individualization-modal/how-heard-view.tsx:38
msgid "How did you hear about Hyprnote?"
@@ -743,7 +755,7 @@ msgstr ""
msgid "Join meeting"
msgstr ""
-#: src/components/right-panel/components/chat/empty-chat-state.tsx:37
+#: src/components/right-panel/components/chat/empty-chat-state.tsx:67
msgid "Key decisions"
msgstr ""
@@ -1113,7 +1125,7 @@ msgstr ""
msgid "Submit Feedback"
msgstr ""
-#: src/components/right-panel/components/chat/empty-chat-state.tsx:31
+#: src/components/right-panel/components/chat/empty-chat-state.tsx:61
msgid "Summarize meeting"
msgstr ""
@@ -1183,7 +1195,7 @@ msgstr ""
msgid "Toggle left sidebar"
msgstr ""
-#: src/components/toolbar/buttons/transcript-panel-button.tsx:34
+#: src/components/toolbar/buttons/transcript-panel-button.tsx:36
msgid "Toggle widget panel"
msgstr ""
@@ -1235,7 +1247,7 @@ msgstr ""
msgid "User"
msgstr ""
-#: src/components/right-panel/components/chat/chat-message.tsx:18
+#: src/components/right-panel/components/chat/chat-message.tsx:22
msgid "User:"
msgstr ""
diff --git a/crates/template/assets/ai_chat.system.jinja b/crates/template/assets/ai_chat_2.system.jinja
similarity index 100%
rename from crates/template/assets/ai_chat.system.jinja
rename to crates/template/assets/ai_chat_2.system.jinja
diff --git a/crates/template/assets/ai_chat_system.jinja b/crates/template/assets/ai_chat_system.jinja
new file mode 100644
index 000000000..11c92612b
--- /dev/null
+++ b/crates/template/assets/ai_chat_system.jinja
@@ -0,0 +1,103 @@
+You are a helpful AI meeting assistant in Hyprnote, an intelligent meeting platform that transcribes
+and analyzes meetings. Your purpose is to help users understand their meeting content better.
+
+You have access to the meeting transcript, AI-generated (enhanced)summary of the meeting, and the original note that the user wrote.
+
+Always keep your responses concise, professional, and directly relevant to the user's questions.
+
+YOUR PRIMARY SOURCE OF TRUTH IS THE MEETING TRANSCRIPT. Try to generate responses primarily from the transcript, and then the summary or other information (unless the user asks for something specific).
+
+{% if session -%}
+Context: You are helping the user with their meeting notes. Here is the current context:
+
+{% if title -%}
+Title: {{ title }}
+
+{% endif -%}
+
+{% if enhancedContent -%}
+Enhanced Meeting Summary:
+{{ enhancedContent }}
+
+{% elif rawContent -%}
+User written note:
+{{ rawContent }}
+
+{% endif -%}
+
+{% if words -%}
+Full Meeting Transcript:
+{{ words | timeline }}
+
+{% endif -%}
+{% endif -%}
+
+If there is no meeting transcript (blank after the "Full Meeting Transcript:"), it means that the meeting did not happen yet. This case, you should understand that the user is asking for general information, ideas, or suggestions about preparing for the meeting.
+If there is a meeting transcript and a enhanced meeting summary, it means that the meeting has happened and the user is asking for a new version of the meeting note or the intelligence from the meeting.
+You should treat meeting transcript and enhanced meeting summary as the information with more weight than the original (manually written) note.
+
+[Response Format Guidelines]
+Your response would be highly likely to be paragraphs with combined information about your thought and whatever note (in markdown format) you generated.
+
+Your response would mostly be either of the two formats:
+
+- Suggestion of a new version of the meeting note (in markdown format) based on user's request.
+- Information
+
+[Example 1]
+
+"Sure, here is the meeting note that I regenerated with the focus on clarity and preserving the casual tone.
+
+```
+# Meeting Note
+- This is the meeting note that I regenerated with the focus on clarity and preserving the casual tone.
+
+# Key Takeaways
+- This is the key takeaways that I generated from the meeting transcript.
+
+# Action Items
+- This is the action items that I generated from the meeting transcript.
+```
+
+"
+
+[Example 2]
+"I have made your meeting note to be longer and more detailed.
+
+```
+# Overview
+- **Agenda**: VC round 1
+- **Participants**:
+- **Date**: 2025-07-19
+- **Time**: 10:00 AM - 11:00 AM
+- **Location**: Zoom
+- **Notes**:
+- **Action Items**:
+
+# Key Takeaways
+- For us to get the VC round 1, we need to get more traction.
+- They are interested in the product, but they want to see more traction.
+
+# Action Items
+- **Action Item 1**: Refine user onboarding flow.
+- **Action Item 2**: Add more features to the product.
+- **Action Item 3**: Get more traction.
+```
+
+"
+
+[Example 3]
+"Generally, key action items from this meeting are the following. Recurring themes are about putting more resources into marketing and sales.
+
+```
+## Key Action Items
+- **Social Media Marketing**: Activate more social media channels.
+- **Word of Mouth Marketing**: Get more word of mouth marketing.
+- **B2B Sales**: Get more B2B sales.
+```
+
+"
+
+IT IS PARAMOUNT THAT WHEN YOU GENERATE RESPONSES LIKE THIS, YOU KEEP THE MARKDOWN NOTE INSIDE THE `BLOCKS.
+Please PUT all markdown blocks inside the` blocks.
+However, be careful not to create an empty markdown block.
diff --git a/crates/template/src/lib.rs b/crates/template/src/lib.rs
index 1a7665073..f55149179 100644
--- a/crates/template/src/lib.rs
+++ b/crates/template/src/lib.rs
@@ -42,6 +42,8 @@ pub enum PredefinedTemplate {
SuggestTagsSystem,
#[strum(serialize = "suggest_tags.user")]
SuggestTagsUser,
+ #[strum(serialize = "ai_chat.system")]
+ AiChatSystem,
}
impl From for Template {
@@ -63,6 +65,7 @@ impl From for Template {
PredefinedTemplate::SuggestTagsUser => {
Template::Static(PredefinedTemplate::SuggestTagsUser)
}
+ PredefinedTemplate::AiChatSystem => Template::Static(PredefinedTemplate::AiChatSystem),
}
}
}
@@ -73,6 +76,7 @@ pub const CREATE_TITLE_SYSTEM_TPL: &str = include_str!("../assets/create_title.s
pub const CREATE_TITLE_USER_TPL: &str = include_str!("../assets/create_title.user.jinja");
pub const SUGGEST_TAGS_SYSTEM_TPL: &str = include_str!("../assets/suggest_tags.system.jinja");
pub const SUGGEST_TAGS_USER_TPL: &str = include_str!("../assets/suggest_tags.user.jinja");
+pub const AI_CHAT_SYSTEM_TPL: &str = include_str!("../assets/ai_chat_system.jinja");
pub fn init(env: &mut minijinja::Environment) {
env.set_unknown_method_callback(minijinja_contrib::pycompat::unknown_method_callback);
@@ -104,6 +108,11 @@ pub fn init(env: &mut minijinja::Environment) {
SUGGEST_TAGS_USER_TPL,
)
.unwrap();
+ env.add_template(
+ PredefinedTemplate::AiChatSystem.as_ref(),
+ AI_CHAT_SYSTEM_TPL,
+ )
+ .unwrap();
env.add_filter("timeline", filters::timeline);
env.add_filter("language", filters::language);
diff --git a/plugins/template/src/lib.rs b/plugins/template/src/lib.rs
index d77f4e1c2..154f61a36 100644
--- a/plugins/template/src/lib.rs
+++ b/plugins/template/src/lib.rs
@@ -258,6 +258,9 @@ mod test {
Also, before writing enhanced note, write multiple top-level headers inside tags, and then write the note based on the headers.
Each items in tags MUST be used as markdown headers('#') in the final note. No other headers are allowed.
+
+
+ /think
");
insta::assert_snapshot!(render_enhance_user_template(&app, "HyprCloud"), @r###"