112 lines
3.8 KiB
TypeScript
112 lines
3.8 KiB
TypeScript
import type { VoiceTool, AgentId } from './_types'
|
||
import { tabletJson } from './_http'
|
||
|
||
const setTimer: VoiceTool = {
|
||
schema: {
|
||
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'],
|
||
},
|
||
},
|
||
},
|
||
|
||
async execute(args, agent: AgentId) {
|
||
const seconds = Number(args?.seconds || 0)
|
||
const label = String(args?.label || 'Таймер')
|
||
if (!Number.isFinite(seconds) || seconds < 1) return { error: 'seconds must be positive' }
|
||
return tabletJson('POST', '/api/voice/timer', {
|
||
action: 'start',
|
||
seconds,
|
||
label,
|
||
agent,
|
||
})
|
||
},
|
||
}
|
||
|
||
const cancelTimer: VoiceTool = {
|
||
schema: {
|
||
type: 'function',
|
||
function: {
|
||
name: 'cancel_timer',
|
||
description:
|
||
'Отменить активный таймер по его названию. Для «отмени таймер чайник», ' +
|
||
'«убери таймер пасты», «останови отсчёт».',
|
||
parameters: {
|
||
type: 'object',
|
||
properties: {
|
||
label: {
|
||
type: 'string',
|
||
description: 'Название таймера (примерное совпадение — можно частично).',
|
||
},
|
||
},
|
||
required: ['label'],
|
||
},
|
||
},
|
||
},
|
||
|
||
async execute(args) {
|
||
const label = String(args?.label || '').trim()
|
||
if (!label) return { error: 'label required' }
|
||
return tabletJson('POST', '/api/voice/timer', { action: 'cancel', label })
|
||
},
|
||
}
|
||
|
||
const adjustTimer: VoiceTool = {
|
||
schema: {
|
||
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'],
|
||
},
|
||
},
|
||
},
|
||
|
||
async execute(args) {
|
||
const label = String(args?.label || '').trim()
|
||
const delta = Number(args?.delta_seconds || 0)
|
||
if (!label) return { error: 'label required' }
|
||
if (!Number.isFinite(delta) || delta === 0) return { error: 'delta_seconds must be non-zero' }
|
||
return tabletJson('POST', '/api/voice/timer', {
|
||
action: 'adjust',
|
||
label,
|
||
delta_seconds: delta,
|
||
})
|
||
},
|
||
}
|
||
|
||
export const tools: VoiceTool[] = [setTimer, cancelTimer, adjustTimer]
|