AI-Планувальник Завдань у Мобільних Застосунках
AI-планувальник—це не просто чат-бот, який додає елементи до списку. Це інтеграція природної мови з реальною логікою: розбір дедлайнів, встановлення пріоритетів, урахування поточного навантаження, синхронізація з нативним календарем.
Розбір завдань із природної мови
Користувач пише «Позвонити Ігорю до кінця тижня про презентацію, важливо»—система повинна виділити: назву завдання, дедлайн, пріоритет і можливу прив'язку до контакту.
Function calling в OpenAI—правильний інструмент:
let tools: [[String: Any]] = [{
"type": "function",
"function": {
"name": "add_task",
"description": "Add a task extracted from user input",
"parameters": {
"type": "object",
"properties": {
"title": {"type": "string", "description": "Task title, concise"},
"due_date": {"type": "string", "format": "date-time", "description": "ISO 8601 deadline if mentioned"},
"priority": {"type": "string", "enum": ["low", "medium", "high", "urgent"]},
"tags": {"type": "array", "items": {"type": "string"}},
"contact_name": {"type": "string", "description": "Person involved if mentioned"}
},
"required": ["title"]
}
}
}]
Контекст для запиту обов'язковий: поточна дата/час і часовий пояс, інакше «до кінця тижня» не розбереться.
let systemPrompt = """
Today is \(ISO8601DateFormatter().string(from: Date())).
Timezone: \(TimeZone.current.identifier).
Extract task details from user input. For relative dates ('next week', 'tomorrow', 'end of week'), calculate exact dates.
"""
Розумне перестановлення пріоритетів
Користувачі погано встановлюють пріоритети самі—все здається терміновим. AI може переоцінити чергу завдань на основі дедлайнів і закономірностей.
struct TaskPrioritizationInput: Encodable {
let tasks: [TaskItem]
let currentDateTime: String
let workingHoursPerDay: Int
}
// Запит на переоцінку пріоритетів
func reprioritize(_ tasks: [TaskItem]) async throws -> [TaskItem] {
let input = TaskPrioritizationInput(
tasks: tasks,
currentDateTime: ISO8601DateFormatter().string(from: Date()),
workingHoursPerDay: userSettings.workHours
)
let prompt = """
Reorder these tasks by urgency+importance matrix.
Consider deadlines and estimated durations.
Mark overdue tasks as urgent.
Return the same array with updated priority field.
Current tasks: \(try JSONEncoder().encode(input).utf8String)
"""
let response = try await openAI.chat(messages: [.system(prompt)])
return try JSONDecoder().decode([TaskItem].self, from: response.text.data(using: .utf8)!)
}
Інтеграція EventKit (iOS) та ContentProvider (Android)
AI-планувальник без синхронізації з системним календарем—половина цінності. EventKit на iOS забезпечує доступ до календаря й нагадувачів.
import EventKit
class CalendarIntegration {
let store = EKEventStore()
func addReminder(for task: TaskItem) async throws {
let granted = try await store.requestFullAccessToReminders()
guard granted else { throw IntegrationError.permissionDenied }
let reminder = EKReminder(eventStore: store)
reminder.title = task.title
reminder.priority = task.priority.ekPriority // Int 1-9
reminder.calendar = store.defaultCalendarForNewReminders()
if let due = task.dueDate {
let components = Calendar.current.dateComponents(
[.year, .month, .day, .hour, .minute],
from: due
)
reminder.dueDateComponents = components
reminder.addAlarm(EKAlarm(relativeOffset: -3600)) // -1 година нагадування
}
try store.save(reminder, commit: true)
}
}
На Android використовуйте CalendarContract для подій календаря. ReminderProvider недоступний системно; використовуйте AlarmManager + NotificationManager для нагадувань.
Щоденний AI-Бриф
Генеруйте короткий план дня при запуску додатка на основі поточних завдань. Це не повноцінний чат—одиночний запит на генерацію тексту:
func generateDailyBrief(tasks: [TaskItem]) async throws -> String {
let todayTasks = tasks.filter { task in
guard let due = task.dueDate else { return task.priority == .urgent }
return Calendar.current.isDateInToday(due) || due < Date()
}
let prompt = """
Create a short (3-5 sentences) morning briefing for the user's day.
Focus on what's most urgent and what should be done first.
Be direct and practical, not motivational.
Tasks: \(todayTasks.map { "\($0.title) [priority: \($0.priority), due: \($0.dueDate?.formatted() ?? "today")]" }.joined(separator: "; "))
"""
return try await openAI.complete(prompt: prompt)
}
Голосовий ввід завдань
Більшість додавання завдань у мобільних застосунках відбувається голосом—швидко, без друку. На iOS використовуйте SFSpeechRecognizer, на Android—SpeechRecognizer API.
Важливо: не чекайте завершення фрази. Використовуйте режим .continuous і обробляйте текст при паузах > 1,5 секунди.
recognitionRequest.shouldReportPartialResults = true
recognitionTask = recognizer.recognitionTask(with: recognitionRequest) { [weak self] result, error in
guard let result else { return }
self?.lastTranscript = result.bestTranscription.formattedString
if result.isFinal {
self?.processVoiceInput(self?.lastTranscript ?? "")
}
}
Після транскрипції текст проходить той же конвеєр function calling, що й текстовий ввід.
Орієнтири за часом
Базовий ввід завдань через природну мову + function calling—3–5 днів. Повноцінний планувальник з пріоритизацією, інтеграцією CalendarKit, щоденним брифом та голосовим вводом—3–5 тижнів.







