Files
d.klimov be0a731738
All checks were successful
Deploy / deploy (push) Successful in 1m52s
voice: усиление умного дома — контекст, промпт, новые tools
- промпт: перечислены ВСЕ 15+ tools, разрешено уверенно управлять домом
- route.ts: живой контекст (время + снимок устройств из HA) в системный промпт
  для LLM-пути (defensive, с таймаутом)
- новые tools: control_climate (кондей/термостат), control_tv, set_scene
  (night/movie/morning/away), all_off, ha_service (универсальный HA с whitelist)
- env: CLIMATE_ENTITY, TV_ENTITY (см. RUNBOOK)
2026-07-22 23:49:50 +03:00

71 lines
2.4 KiB
TypeScript

import type { VoiceTool } from './_types'
import { tabletJson } from './_http'
/**
* Телевизор через Home Assistant (домен media_player).
* Entity задаётся TV_ENTITY (по умолчанию media_player.tv).
*/
const ENTITY = () => process.env.TV_ENTITY || 'media_player.tv'
const controlTv: VoiceTool = {
schema: {
type: 'function',
function: {
name: 'control_tv',
description:
'Управление телевизором: включить/выключить, громкость, пауза/воспроизведение, звук. ' +
'Используй для «включи телевизор», «выключи ТВ», «сделай телевизор тише», «поставь на паузу».',
parameters: {
type: 'object',
properties: {
action: {
type: 'string',
enum: ['turn_on', 'turn_off', 'volume', 'play', 'pause', 'mute'],
description: 'Что сделать',
},
volume: {
type: 'number',
description: 'Громкость 0-100 при action=volume',
},
},
required: ['action'],
},
},
},
async execute(args) {
const action = String(args?.action || '')
const entity_id = ENTITY()
let payload: Record<string, any>
switch (action) {
case 'turn_on':
case 'turn_off':
payload = { domain: 'media_player', service: action, entity_id }
break
case 'play':
payload = { domain: 'media_player', service: 'media_play', entity_id }
break
case 'pause':
payload = { domain: 'media_player', service: 'media_pause', entity_id }
break
case 'mute':
payload = { domain: 'media_player', service: 'volume_mute', entity_id, is_volume_muted: true }
break
case 'volume': {
const v = Number(args?.volume)
if (!Number.isFinite(v)) return { error: 'volume required' }
payload = { domain: 'media_player', service: 'volume_set', entity_id, volume_level: Math.max(0, Math.min(1, v / 100)) }
break
}
default:
return { error: `unknown action: ${action}` }
}
await tabletJson('POST', '/api/voice/tools/smart-home', payload)
return { success: true, action, ...(action === 'volume' ? { volume: args?.volume } : {}) }
},
}
export const tools: VoiceTool[] = [controlTv]