from typing import Optional import streamlit as st from humanize import naturaltime from api.models_service import models_service from api.notes_service import notes_service from open_notebook.domain.notebook import Note from pages.components import note_panel from .consts import note_context_icons @st.dialog("Write a Note", width="large") def add_note(notebook_id): default_models = models_service.get_default_models() if not default_models.default_embedding_model: st.warning( "Since there is no embedding model selected, your note will be saved but not searchable." ) note_title = st.text_input("Title") note_content = st.text_area("Content") if st.button("Save", key="add_note"): notes_service.create_note( content=note_content, title=note_title, note_type="human", notebook_id=notebook_id ) st.rerun() @st.dialog("Add a Note", width="large") def note_panel_dialog(note: Optional[Note] = None, notebook_id=None): if not note: raise ValueError("Note is required") note_panel(note_id=note.id, notebook_id=notebook_id) def make_note_from_chat(content, notebook_id=None): # Title will be auto-generated by the API for AI notes notes_service.create_note( content=content, title=None, # Let API generate it note_type="ai", notebook_id=notebook_id ) st.rerun() def note_card(note, notebook_id): if note.note_type == "human": icon = "🤵" else: icon = "🤖" with st.container(border=True): st.markdown((f"{icon} **{note.title if note.title else 'No Title'}**")) context_state = st.selectbox( "Context", label_visibility="collapsed", options=note_context_icons, index=1, key=f"note_{note.id}", ) st.caption(f"Updated: {naturaltime(note.updated)}") if st.button("Expand", icon="📝", key=f"edit_note_{note.id}"): note_panel_dialog(notebook_id=notebook_id, note=note) st.session_state[notebook_id]["context_config"][note.id] = context_state def note_list_item(note_id, score=None): note = notes_service.get_note(note_id) if note.note_type == "human": icon = "🤵" else: icon = "🤖" with st.expander( f"{icon} [{score:.2f}] **{note.title}** {naturaltime(note.updated) if note.updated else 'N/A'}" ): st.write(note.content) if st.button("Edit Note", icon="📝", key=f"x_edit_note_{note.id}"): note_panel_dialog(note=note)