Omni Assistant began as several separate AI coursework assignments (chat, voice, summarization, and data interaction). Instead of shipping isolated demos, it was redesigned into one cohesive, portfolio-grade assistant platform with a single backend, a single UI, and layered capabilities added deliberately.
This project prioritizes explicit user control, clear boundaries, and defensible engineering decisions over “magic” automation.
- One Flask backend
- One UI
- A single
/chatbotroute - Layered capabilities, added in a fixed order
- Explicit activation (modes/commands), not background automation
Non-goals:
- No agents
- No web browsing
- No background tasks
- No hidden persistence (except Career Coach memory, explicitly disk-backed)
- No job placement claims or automation
Baseline chat experience.
- Flask backend with a single
/chatbotPOST route - Groq-hosted LLaMA model
- In-memory conversation history (session-only)
- Clean web UI
Frontend-only voice features using browser-native APIs.
Speech-to-Text (STT)
- Web Speech API
- Push-to-talk microphone
- Voice fills the input; user manually submits
- Safari timing guard fixed
Text-to-Speech (TTS)
- Browser SpeechSynthesis API
- Off by default
- Toggleable per session
- Cancels speech immediately on typing or mic input
A deterministic meeting summarizer triggered only by an explicit header.
Trigger:
- Input must start with:
MEETING TRANSCRIPT:
Outputs:
- Meeting Summary
- Action Items (explicit tasks only; no inferred work)
- Key Decisions (only if explicitly present)
- Open Questions / Risks (only if explicitly present)
Guardrails:
- Temperature 0 for deterministic behavior
- No invented owners, due dates, or decisions
- No persistence or automation
Grounded, session-scoped Q&A from user-supplied data.
How it works:
- Layer 4 activates only when
context_itemsare explicitly provided - Without context, the system behaves like Layer 1
- With context, answers are generated only from retrieved snippets
Retrieval approach:
- Deterministic keyword-overlap scoring (no embeddings)
- Paragraph-based chunking
- Returns up to 3 top snippets
Grounding rules:
- Answers only from retrieved snippets
- Includes sources
- If insufficient data: returns “Not enough information” and asks for the missing data
Non-goals:
- No persistence
- No vector database
- No web browsing
- No automation
A command-based job prep assistant with explicit, user-controlled memory.
Design intent
This layer is built for real job preparation and honest assistance. It avoids automation claims and documents the limits of narrative generation.
Persistence
- Career Coach memory is disk-backed (explicitly stored on the local machine)
Commands
CAREER: SAVE RESUME | <text>CAREER: SAVE JD | <text>CAREER: SHOW MEMORYCAREER: CLEAR MEMORYCAREER: REVIEW RESUMECAREER: REWRITE BULLETS | <target role>CAREER: GENERATE COVER LETTER
Behavior guarantees (important)
- Resume storage/review are grounded and transparent
- Bullet rewriting is designed to be strictly grounded in provided resume content
- Cover letter generation is assistive drafting:
- Narrative writing can encourage embellishment in any LLM
- Over-filtering attempts can become brittle
- This project chooses an honest boundary: cover letters may require user review and editing
- If the system cannot produce a result without unsupported details/placeholders, it will refuse and explain what information is missing
This tradeoff is deliberate and documented.
cd ~/Desktop/omni-assistant
source venv/bin/activate
pip install -r requirements.txt
python app.pyOpen:
- Python + Flask
- Groq API (LLM inference)
- Browser Web Speech API (STT)
- Browser SpeechSynthesis API (TTS)
- Deterministic retrieval (keyword overlap) for RAG mode
- Local disk-backed memory for Career Coach (explicit)
MIT License