MAX_BODY_CHARS = 8000 def build_assist_messages( body: str, target_section: str, instruction: str ) -> list[dict]: """Build Ollama messages for section-level assist. The full note body (truncated) is provided as read-only context in the system prompt. The target section + user instruction go in the user message. The model outputs only the replacement for the target section. """ truncated_body = body[:MAX_BODY_CHARS] if len(body) > MAX_BODY_CHARS: truncated_body += "\n... (truncated)" system_content = ( "You are an AI writing assistant integrated into a note-taking app. " "The user is editing a document. The full document is shown below for context.\n\n" f"--- Full Document ---\n{truncated_body}\n--- End Document ---\n\n" "The user will give you a specific section of the document and an instruction. " "Output ONLY the replacement text for that section. " "If the target section starts with a markdown heading (e.g. ## Heading), " "your output MUST also start with a heading at the same level. " "You may revise the heading text but do not remove it. " "Do not include other sections, explanatory text, or markdown code fences around the output. " "Match the document's existing tone and style. " "IMPORTANT: Preserve all markdown formatting exactly — including bullet lists (- item), " "numbered lists (1. item), nested/indented sub-items ( - sub), bold (**text**), " "italic (_text_), and code blocks. Never flatten nested lists into plain text." ) user_content = ( f"--- Target Section ---\n{target_section}\n--- End Target Section ---\n\n" f"Instruction: {instruction}" ) return [ {"role": "system", "content": system_content}, {"role": "user", "content": user_content}, ]