/** * Tool schemas для Groq API (OpenAI-compatible format). * Было: Anthropic.Tool[] (input_schema) → Стало: Groq/OpenAI function tools (parameters). */ export interface GroqTool { type: 'function' function: { name: string description: string parameters: { type: string properties: Record required?: string[] } } } export const TOOL_SCHEMAS: GroqTool[] = [ { type: 'function', function: { name: 'get_weather', description: 'Получить текущую погоду и короткий прогноз для города. ' + 'Для вопросов вроде «какая сегодня погода», «холодно ли на улице», «нужен ли зонт». ' + 'По умолчанию — Санкт-Петербург.', parameters: { type: 'object', properties: { city: { type: 'string', description: 'Город на русском или шорткод (spb, msk, sochi, ekb, kzn, nsk, krd). ' + 'По умолчанию Санкт-Петербург.', }, }, }, }, }, { type: 'function', function: { name: 'get_transport', description: 'Расписание ближайших трамваев на остановке Ул. Антонова-Овсеенко. ' + 'Для вопросов «когда следующий 23-й», «что ближайшее в центр», «пора идти на остановку».', parameters: { type: 'object', properties: { direction: { type: 'string', enum: ['to_center', 'from_center', 'all'], description: 'to_center = в центр (к Новочеркасской), ' + 'from_center = от центра (к Большевиков), all = оба направления', }, routes: { type: 'string', description: 'Фильтр маршрутов через запятую, например «23» или «23,27». Пусто = все маршруты.', }, }, }, }, }, { type: 'function', function: { name: 'get_today_events', description: 'События из календаря (Даниил + Света). Вернёт id события, title, start, end, ' + 'owner («daniil» или «sveta»). ВАЖНО: для update_event / delete_event сначала ' + 'вызывай этот tool чтобы получить event_id.', parameters: { type: 'object', properties: { range: { type: 'string', enum: ['today', 'week', 'month'], description: 'today (по умолчанию), week (7 дней) или month (текущий месяц)', }, }, }, }, }, { type: 'function', function: { name: 'create_event', description: 'Создать событие в Google Calendar. ВАЖНО: параметр owner обязателен. ' + 'Если пользователь не сказал чей это календарь — СПРОСИ у него ' + '(«в твой календарь или в Светин?») и только потом вызывай tool. Не угадывай.', parameters: { type: 'object', properties: { title: { type: 'string', description: 'Название события' }, date: { type: 'string', description: 'Дата в формате YYYY-MM-DD' }, start_time: { type: 'string', description: 'Время начала в формате HH:MM (24-часовой). Обязательно если all_day=false.', }, end_time: { type: 'string', description: 'Время окончания в формате HH:MM. По умолчанию start_time + 1 час.', }, all_day: { type: 'boolean', description: 'Событие на весь день без времени. По умолчанию false.', }, owner: { type: 'string', enum: ['daniil', 'sveta'], description: 'Чей это календарь — Даниила или Светы', }, }, required: ['title', 'date', 'owner'], }, }, }, { type: 'function', function: { name: 'update_event', description: 'Изменить существующее событие. Сначала обязательно вызови get_today_events ' + 'чтобы получить event_id и owner нужного события. Передавай только те поля ' + 'которые меняешь.', parameters: { type: 'object', properties: { event_id: { type: 'string' }, owner: { type: 'string', enum: ['daniil', 'sveta'], description: 'Чей календарь (из get_today_events)', }, title: { type: 'string' }, date: { type: 'string', description: 'YYYY-MM-DD' }, start_time: { type: 'string', description: 'HH:MM' }, end_time: { type: 'string', description: 'HH:MM' }, all_day: { type: 'boolean' }, }, required: ['event_id', 'owner'], }, }, }, { type: 'function', function: { name: 'delete_event', description: 'Удалить событие из календаря. Сначала вызови get_today_events чтобы найти ' + 'event_id и определить owner. Подтверди удаление с пользователем если событие ' + 'важное (встреча, врач, работа).', parameters: { type: 'object', properties: { event_id: { type: 'string' }, owner: { type: 'string', enum: ['daniil', 'sveta'] }, }, required: ['event_id', 'owner'], }, }, }, { type: 'function', function: { name: 'get_notes', description: 'Список заметок и списков покупок с планшета. Для «что мне купить», ' + '«что в списке», «какие записи».', parameters: { type: 'object', properties: {}, }, }, }, { type: 'function', function: { name: 'set_timer', description: 'Запустить таймер на планшете. Показывает обратный отсчёт с названием и звенит ' + 'по окончании. Используй для «поставь таймер на 10 минут», «напомни через час», ' + '«засеки 5 минут для чайника».', parameters: { type: 'object', properties: { seconds: { type: 'integer', description: 'Длительность в секундах (1..86400)', minimum: 1, maximum: 86400, }, label: { type: 'string', description: 'Короткое название таймера (например «Чайник», «Паста»)', }, }, required: ['seconds', 'label'], }, }, }, { type: 'function', function: { name: 'cancel_timer', description: 'Отменить активный таймер по его названию. Для «отмени таймер чайник», ' + '«убери таймер пасты», «останови отсчёт».', parameters: { type: 'object', properties: { label: { type: 'string', description: 'Название таймера (примерное совпадение — можно частично).', }, }, required: ['label'], }, }, }, { type: 'function', function: { name: 'adjust_timer', description: 'Изменить оставшееся время таймера. Для «добавь ещё 5 минут», «убавь на минуту», ' + '«накинь времени чайнику». Положительный delta_seconds = добавить, отрицательный = уменьшить.', parameters: { type: 'object', properties: { label: { type: 'string', description: 'Название таймера для которого меняем время.', }, delta_seconds: { type: 'integer', description: 'Секунды (+ добавить, - уменьшить). Например 300 = +5 минут, -60 = -1 минута.', }, }, required: ['label', 'delta_seconds'], }, }, }, ]