voice: усиление умного дома — контекст, промпт, новые tools
All checks were successful
Deploy / deploy (push) Successful in 1m52s
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)
This commit is contained in:
70
lib/tools/tv.ts
Normal file
70
lib/tools/tv.ts
Normal file
@@ -0,0 +1,70 @@
|
||||
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]
|
||||
Reference in New Issue
Block a user