DEV Community

Cover image for 🤔 To Do Assistant: The Plan
Mai Chi Bao
Mai Chi Bao

Posted on

1 1 1 1 1

🤔 To Do Assistant: The Plan

Table of Contents

What My Old Task Separator Looks Like

I previously built an app called the "Task Separator," which I discussed in another post. Here's how it worked:

  • I used a Telegram bot to receive voice inputs like "remind me to play badminton."
  • The Whisper model converted the speech to text.
  • The app then created tasks in Microsoft To Do, adding attributes like importance, reminder time, and due date.
  • Task generation was powered by ChatGPT 4o Mini.

For example:

Input: "I want to go shopping at 8 o'clock and call my parents tomorrow"
Output: ["Go shopping at 8 o'clock", "Call my parents tomorrow"]
Enter fullscreen mode Exit fullscreen mode

That's why I called it the "Task Separator"—it splits a single input into multiple tasks.

Disadvantages of the Old App

While the concept was solid, the app had several practical drawbacks:

  • Inconvenience: I had to open Telegram to use the voice feature, unlike "Hey Google," "Hi Bixby," or "Hi Siri," which work directly from the lock screen.
  • Language Issues: Whisper struggled with Vietnamese speech-to-text conversion.
  • Memory Lapses: When using voice mode, I often forgot tasks mid-sentence, leading to clumsy inputs with "uhm" or "oh." For example:
  Input: "I want to go shopping at 8 o'clock, uhm, I'm sorry, at 9 o'clock."
  Output: ["Go shopping at 9 o'clock."]
Enter fullscreen mode Exit fullscreen mode
  • Lack of Personalization: ChatGPT couldn’t generate tasks with attributes tailored to my preferences (e.g., importance, due date, reminder time).
  • Limited Task Management: The app couldn’t read my "My Day" tasks in Microsoft To Do, prioritize them, assign time blocks, or assess importance.
  • Generic Subtasks: It couldn’t generate personalized subtasks based on my habits. For instance, when I said, "Pack my package to go to Gia Lai," I wanted:
  - My hat
  - My skincare box
  - My shoes
Enter fullscreen mode Exit fullscreen mode

But it generated generic subtasks like:

  - 📦 Get a sturdy box (right size for your items)
  - đź“ś Prepare cushioning materials (bubble wrap, foam, paper)
  - 🎀 Get sealing supplies (packing tape, rope, zip ties)
  - 🏷 Prepare labels & markers (to write addresses & handling instructions)
Enter fullscreen mode Exit fullscreen mode
  • Reminder Updates: If a task was due today but had an outdated reminder, the app couldn’t adjust it dynamically based on importance or timing.

What To Do Assistant Should Look Like

I’m planning a more powerful version of the app, tentatively called "To Do Assistant," to act as a true personal assistant. Here’s what I envision:

  • Personalized Task Generation: Fine-tune a model using my 1000+ Microsoft To Do tasks to create tasks tailored to me.
  • Efficient Model: Use a small, CPU-friendly model (e.g., LLaMA 1B with GGUF conversion) for fast performance.
  • Advanced Attributes: Generate tasks with importance, reminder time, due date, task order, and time blocks.
  • Smart Subtasks: Create subtasks based on my past tasks, designed to help me complete them effectively (e.g., "mouse trap" tasks—specific, actionable steps).
  • Dynamic Reminders: Automatically update reminder times based on due dates and task importance.

Finetuning the Model

The Model

  • Choice: I’ll use Meta’s LLaMA 3.2 1B—a small, fast model ideal for simple text generation with JSON output.
  • Finetuning: I already have a script for fine-tuning LLaMA models, so this should be straightforward.
  • Optimization: Convert it to GGUF using LLaMA.cpp for quick inference (under 1 minute) on a CPU, avoiding GPU dependency.

The Data

My Microsoft To Do tasks provide a rich dataset. Key fields include:

  • 'importance': 'normal' or 'high'
  • 'title': Task name
  • 'dueDateTime': Due date and time (tasks due today move to "My Day")
  • 'reminderDateTime': Reminder date and time
  • 'checklistItems': Subtask list
  • 'displayName': Subtask name

Example task 1:

{'@odata.etag': 'W/"wyYSbsYOaUCZPsQATrx1BgAF65hKYA=="',
 'importance': 'high',
 'isReminderOn': True,
 'status': 'notStarted',
 'title': 'Lấy đồ giặt',
 'createdDateTime': '2025-02-24T06:04:01.7672011Z',
 'lastModifiedDateTime': '2025-02-24T06:04:01.8412826Z',
 'hasAttachments': False,
 'categories': [],
 'id': 'AQMkADAwATMwMAItMTg4AGMtZmRiNC0wMAItMDAKAEYAAAORlXbjKGFLSJiBLf4_KVkjBwDDJhJuxg5pQJk_xABOvHUGAAACARIAAADDJhJuxg5pQJk_xABOvHUGAAXrRkVZAAAA',
 'body': {'content': '\r\n', 'contentType': 'text'},
 'reminderDateTime': {'dateTime': '2025-02-24T13:30:00.0000000',
  'timeZone': 'UTC'}}
Enter fullscreen mode Exit fullscreen mode

Example task 2:

{'@odata.etag': 'W/"wyYSbsYOaUCZPsQATrx1BgAF7/WDuQ=="',
 'importance': 'normal',
 'isReminderOn': True,
 'status': 'notStarted',
 'title': 'Tập cách phòng thủ boxing',
 'createdDateTime': '2025-03-01T11:33:46.8008426Z',
 'lastModifiedDateTime': '2025-03-02T06:49:30.8839298Z',
 'hasAttachments': False,
 'categories': [],
 'id': 'AQMkADAwATMwMAItMTg4AGMtZmRiNC0wMAItMDAKAEYAAAORlXbjKGFLSJiBLf4_KVkjBwDDJhJuxg5pQJk_xABOvHUGAAACARIAAADDJhJuxg5pQJk_xABOvHUGAAXvowPnAAAA',
 'body': {'content': '', 'contentType': 'text'},
 'dueDateTime': {'dateTime': '2025-03-01T17:00:00.0000000', 'timeZone': 'UTC'},
 'reminderDateTime': {'dateTime': '2025-03-02T11:00:00.0000000',
  'timeZone': 'UTC'},
 'checklistItems@odata.context': "https://graph.microsoft.com/v1.0/$metadata#users('chibao24.12.1999%40gmail.com')/todo/lists('AQMkADAwATMwMAItMTg4AGMtZmRiNC0wMAItMDAKAC4AAAORlXbjKGFLSJiBLf4_KVkjAQDDJhJuxg5pQJk_xABOvHUGAAACARIAAAA%3D')/tasks('AQMkADAwATMwMAItMTg4AGMtZmRiNC0wMAItMDAKAEYAAAORlXbjKGFLSJiBLf4_KVkjBwDDJhJuxg5pQJk_xABOvHUGAAACARIAAADDJhJuxg5pQJk_xABOvHUGAAXvowPnAAAA')/checklistItems",
 'checklistItems': [{'displayName': 'Có bao nhiêu cách phòng thủ',
   'createdDateTime': '2025-03-01T11:34:11.8487799Z',
   'isChecked': False,
   'id': 'ead45dd7-83f0-4181-80de-ff1c96119c2e'},
  {'displayName': 'Coi tiktok',
   'createdDateTime': '2025-03-01T11:34:18.0141856Z',
   'isChecked': False,
   'id': '1f7d9471-25a2-4af4-9232-03f1e3d5297b'},
  {'displayName': 'Check youtube',
   'createdDateTime': '2025-03-01T11:34:24.0323591Z',
   'isChecked': False,
   'id': '92fbe045-5aed-49c1-9821-9af6274326b6'}]}
Enter fullscreen mode Exit fullscreen mode

The Flow

Here’s how I envision the fine-tuned model processing inputs, with outputs as JSON lists containing task details and priorities:

  1. Splitting Multiple Tasks: When I provide a long input (e.g., a "My Day" task title) combining multiple tasks, the model splits them into separate entries with attributes. This data can be pulled directly from Microsoft To Do.
   Input: "go shopping at 9 o'clock, go to school"
   Output: [
     {
       "importance": "normal",
       "title": "Go shopping",
       "dueDateTime": "2025-03-02T09:00:00.0000000",
       "reminderDateTime": "2025-03-02T08:30:00.0000000",
       "checklistItems": [],
     },
     {
       "importance": "high",
       "title": "Go to school",
       "dueDateTime": "2025-03-02T08:00:00.0000000",
       "reminderDateTime": "2025-03-02T07:30:00.0000000",
       "checklistItems": [],
     }
   ]
Enter fullscreen mode Exit fullscreen mode

Here, "Go to school" gets (higher priority) due to an earlier time, while "Go shopping" should be done later

  1. Handling Clumsy Speech: For verbose or corrected inputs (e.g., from Whisper’s speech-to-text), the model extracts tasks, adjusts errors, and adds attributes with an order. Since I lack this data, I’ll generate 30% of the fine-tuning dataset using ChatGPT based on my existing tasks.
   Input: "I want to go shopping at 8 o'clock, uhm, I'm sorry, at 9 o'clock and go to school at 7 AM"
   Output: [
     {
       "importance": "normal",
       "title": "Go shopping",
       "dueDateTime": "2025-03-02T09:00:00.0000000",
       "reminderDateTime": "2025-03-02T08:30:00.0000000",
       "checklistItems": [],
     },
     {
       "importance": "high",
       "title": "Go to school",
       "dueDateTime": "2025-03-02T07:00:00.0000000",
       "reminderDateTime": "2025-03-02T06:30:00.0000000",
       "checklistItems": [],
     }
   ]
Enter fullscreen mode Exit fullscreen mode

The model corrects "8 o'clock" to "9 o'clock" and prioritizes "Go to school" (order: 1) due to its earlier time.

  1. Single Task Processing: For a simple input with one task, the model generates a single JSON entry with attributes and assigns it the top priority by default.
   Input: "I want to go shopping at 9 o'clock"
   Output: [
     {
       "importance": "normal",
       "title": "Go shopping",
       "dueDateTime": "2025-03-02T09:00:00.0000000",
       "reminderDateTime": "2025-03-02T08:30:00.0000000",
       "checklistItems": [],
     }
   ]
Enter fullscreen mode Exit fullscreen mode

The order attribute ensures tasks are prioritized logically (e.g., based on time or importance), starting with 1 for the first task to complete, then 2, 3, and so on.

Sum Up

This plan outlines the evolution of my Task Separator into the To Do Assistant. By addressing the old app’s shortcomings and leveraging fine-tuning with my Microsoft To Do data, I aim to create a personalized, efficient assistant. Next steps: start fine-tuning the model and building the new app. Let’s see how it goes!

Heroku

Deploy with ease. Manage efficiently. Scale faster.

Leave the infrastructure headaches to us, while you focus on pushing boundaries, realizing your vision, and making a lasting impression on your users.

Get Started

Top comments (1)

Collapse
 
mrzaizai2k profile image
Mai Chi Bao •

Love the idea of turning your Task Separator into a full-blown To Do Assistant! The personalized subtasks sound like a game-changer—can’t wait to hear how it turns out!

A Workflow Copilot. Tailored to You.

Pieces.app image

Our desktop app, with its intelligent copilot, streamlines coding by generating snippets, extracting code from screenshots, and accelerating problem-solving.

Read the docs

đź‘‹ Kindness is contagious

Engage with a wealth of insights in this thoughtful article, valued within the supportive DEV Community. Coders of every background are welcome to join in and add to our collective wisdom.

A sincere "thank you" often brightens someone’s day. Share your gratitude in the comments below!

On DEV, the act of sharing knowledge eases our journey and fortifies our community ties. Found value in this? A quick thank you to the author can make a significant impact.

Okay