All checks were successful
Deploy / deploy (push) Successful in 1m52s
- промпт: перечислены ВСЕ 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)
71 lines
2.4 KiB
TypeScript
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]
|