inou/PROMPT-FUNCTION-BRIEF.md

78 lines
2.8 KiB
Markdown

# Prompt Function — Flagship Feature Brief
## Vision
This is one of inou's flagship features. It must be **awesome beyond belief** — pretty, intuitive, fast, useful.
User types natural language → system understands, stores, and intelligently follows up.
**Examples:**
- "I had a headache, took a Tylenol" → logs both, asks tomorrow "Did you take Tylenol?"
- "Blood pressure 120/80" → stores with proper fields (systolic/diastolic)
- "Leg trainer: 3 sets, 12 reps, 45kg" → handles complex multi-parameter input
- "My period stopped" → does NOT ask about period the next day
- "I'm pregnant" then later "I had my period" → handles contradiction intelligently
## Core Concept
Everything displays as a **prompt card**. The card's state changes:
- **Due** — waiting for input
- **Completed** — what you just told us (confirmation)
- **Pending** — coming tomorrow
When you type freeform input, you immediately see it as a completed card. Tomorrow's follow-up appears as a due card.
## Smart & Sensitive
The system must be intelligent about follow-ups:
- One-time events don't generate recurring prompts
- Contradictions are handled (pregnancy → period means pregnancy ended)
- "Stopped taking X" dismisses the X prompt
- Context matters — understand what makes sense to ask again
## Design
Follow the styleguide: `inou.com/styleguide`
Cards are not in the styleguide yet — design freedom here, but match the inou aesthetic.
## Existing Code
**LLM Pipeline:**
- `api/prompts/triage.md` — categorizes input
- `api/prompts/*.md` — category-specific extraction prompts
- `api/api_llm.go``callLLMForPrompt()` orchestrates triage → extraction
- `api/api_prompts.go` — API endpoints, `tryGeneratePromptFromFreeform()`
**Data:**
- `lib/types.go``Prompt`, `Entry` structs
- `lib/prompt.go` — CRUD, respond, skip, dismiss
**UI:**
- `portal/prompts.go` — current prompts page
- `portal/templates/prompts.tmpl` — current template
**Test harness:**
- `test-prompts/main.go` — CLI tool: `./test-prompts "I took aspirin"`
## Flexibility
Input configs must handle:
- Single checkbox ("Did you take X?")
- Multiple checkboxes ("Morning pills: ☐ Lisinopril ☐ Metformin")
- Numeric with units ("Weight: ___ kg")
- Multi-field ("BP: ___/___ mmHg")
- Complex forms ("Leg trainer: sets ___ reps ___ weight ___")
- Scales ("Pain level 1-10")
The LLM extraction prompts define `input_config` — the UI renders whatever structure it returns.
## Must Have
- **Empty prompt always at top** — the primary entry point, always visible, inviting input
- Edit recognized prompts (change question, schedule, fields)
- Delete/dismiss prompts
- Works beautifully on web and mobile (WebView)
- Fast — no jarring waits after input
- Immediate visual confirmation of what was captured