homeassistant 2025.7.0b8__py3-none-any.whl → 2025.7.1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- homeassistant/components/acaia/translations/ga.json +36 -0
- homeassistant/components/ai_task/translations/ga.json +22 -1
- homeassistant/components/ai_task/translations/nl.json +3 -0
- homeassistant/components/airgradient/translations/it.json +3 -3
- homeassistant/components/airzone/translations/it.json +1 -1
- homeassistant/components/airzone_cloud/translations/ga.json +6 -0
- homeassistant/components/airzone_cloud/translations/it.json +2 -2
- homeassistant/components/alarm_control_panel/translations/ga.json +7 -0
- homeassistant/components/alarmdecoder/translations/ga.json +11 -0
- homeassistant/components/alexa_devices/manifest.json +1 -1
- homeassistant/components/alexa_devices/translations/cs.json +2 -1
- homeassistant/components/alexa_devices/translations/de.json +2 -1
- homeassistant/components/alexa_devices/translations/el.json +2 -1
- homeassistant/components/alexa_devices/translations/es.json +2 -1
- homeassistant/components/alexa_devices/translations/et.json +2 -1
- homeassistant/components/alexa_devices/translations/ga.json +26 -0
- homeassistant/components/alexa_devices/translations/he.json +1 -0
- homeassistant/components/alexa_devices/translations/ja.json +32 -0
- homeassistant/components/alexa_devices/translations/lt.json +29 -2
- homeassistant/components/alexa_devices/translations/mk.json +8 -0
- homeassistant/components/alexa_devices/translations/pt.json +2 -1
- homeassistant/components/alexa_devices/translations/sk.json +2 -1
- homeassistant/components/alexa_devices/translations/zh-Hans.json +2 -1
- homeassistant/components/alexa_devices/translations/zh-Hant.json +2 -1
- homeassistant/components/altruist/translations/ga.json +41 -0
- homeassistant/components/altruist/translations/he.json +18 -0
- homeassistant/components/altruist/translations/ja.json +2 -1
- homeassistant/components/amberelectric/translations/ga.json +11 -0
- homeassistant/components/analytics_insights/translations/ga.json +42 -0
- homeassistant/components/androidtv/translations/ga.json +11 -0
- homeassistant/components/androidtv_remote/translations/cs.json +1 -1
- homeassistant/components/androidtv_remote/translations/de.json +1 -1
- homeassistant/components/androidtv_remote/translations/el.json +1 -2
- homeassistant/components/androidtv_remote/translations/en-GB.json +1 -2
- homeassistant/components/androidtv_remote/translations/en.json +1 -1
- homeassistant/components/androidtv_remote/translations/es.json +1 -1
- homeassistant/components/androidtv_remote/translations/et.json +1 -1
- homeassistant/components/androidtv_remote/translations/fi.json +0 -9
- homeassistant/components/androidtv_remote/translations/fr.json +1 -2
- homeassistant/components/androidtv_remote/translations/gl.json +0 -9
- homeassistant/components/androidtv_remote/translations/he.json +1 -2
- homeassistant/components/androidtv_remote/translations/hu.json +1 -2
- homeassistant/components/androidtv_remote/translations/id.json +0 -9
- homeassistant/components/androidtv_remote/translations/it.json +0 -9
- homeassistant/components/androidtv_remote/translations/ja.json +1 -2
- homeassistant/components/androidtv_remote/translations/ko.json +0 -5
- homeassistant/components/androidtv_remote/translations/lt.json +1 -1
- homeassistant/components/androidtv_remote/translations/lv.json +0 -9
- homeassistant/components/androidtv_remote/translations/nl.json +1 -2
- homeassistant/components/androidtv_remote/translations/pt.json +1 -2
- homeassistant/components/androidtv_remote/translations/ru.json +1 -2
- homeassistant/components/androidtv_remote/translations/sk.json +1 -1
- homeassistant/components/androidtv_remote/translations/sl.json +1 -2
- homeassistant/components/androidtv_remote/translations/sv.json +1 -2
- homeassistant/components/androidtv_remote/translations/tr.json +1 -2
- homeassistant/components/androidtv_remote/translations/zh-Hans.json +1 -1
- homeassistant/components/androidtv_remote/translations/zh-Hant.json +1 -1
- homeassistant/components/anthropic/translations/he.json +19 -0
- homeassistant/components/anthropic/translations/ja.json +21 -0
- homeassistant/components/aosmith/translations/nb.json +2 -1
- homeassistant/components/aprilaire/translations/it.json +14 -14
- homeassistant/components/apsystems/translations/ga.json +7 -0
- homeassistant/components/aseko_pool_live/translations/ga.json +25 -0
- homeassistant/components/assist_pipeline/translations/ga.json +14 -0
- homeassistant/components/assist_satellite/translations/ga.json +31 -2
- homeassistant/components/assist_satellite/translations/nl.json +7 -0
- homeassistant/components/asuswrt/translations/ga.json +24 -0
- homeassistant/components/august/translations/ga.json +11 -0
- homeassistant/components/aurora/translations/ga.json +11 -0
- homeassistant/components/autarco/translations/ga.json +37 -0
- homeassistant/components/automation/translations/it.json +2 -2
- homeassistant/components/axis/translations/ga.json +14 -0
- homeassistant/components/azure_devops/translations/ga.json +10 -0
- homeassistant/components/azure_event_hub/translations/ga.json +12 -0
- homeassistant/components/bang_olufsen/translations/el.json +24 -1
- homeassistant/components/bang_olufsen/translations/ga.json +92 -0
- homeassistant/components/binary_sensor/translations/he.json +1 -1
- homeassistant/components/binary_sensor/translations/it.json +4 -4
- homeassistant/components/blink/translations/ga.json +11 -0
- homeassistant/components/bmw_connected_drive/translations/el.json +5 -1
- homeassistant/components/bmw_connected_drive/translations/ga.json +56 -0
- homeassistant/components/bond/translations/el.json +11 -0
- homeassistant/components/bring/translations/el.json +1 -0
- homeassistant/components/bring/translations/ga.json +53 -0
- homeassistant/components/brother/translations/ga.json +53 -0
- homeassistant/components/bsblan/translations/ga.json +20 -0
- homeassistant/components/calendar/translations/ca.json +1 -1
- homeassistant/components/calendar/translations/it.json +2 -2
- homeassistant/components/cambridge_audio/translations/ga.json +60 -0
- homeassistant/components/cambridge_audio/translations/it.json +2 -2
- homeassistant/components/camera/translations/ga.json +15 -0
- homeassistant/components/climate/translations/ga.json +39 -0
- homeassistant/components/climate/translations/it.json +9 -9
- homeassistant/components/climate/translations/ja.json +3 -0
- homeassistant/components/cloud/manifest.json +1 -1
- homeassistant/components/cloudflare/translations/es.json +1 -1
- homeassistant/components/comelit/translations/it.json +3 -0
- homeassistant/components/cookidoo/translations/ga.json +47 -1
- homeassistant/components/deluge/translations/ga.json +12 -0
- homeassistant/components/demo/translations/ga.json +2 -1
- homeassistant/components/demo/translations/it.json +3 -3
- homeassistant/components/derivative/translations/ga.json +6 -0
- homeassistant/components/devolo_home_control/translations/ga.json +37 -0
- homeassistant/components/devolo_home_control/translations/he.json +6 -0
- homeassistant/components/devolo_home_control/translations/lt.json +10 -0
- homeassistant/components/devolo_home_network/translations/ga.json +13 -0
- homeassistant/components/discovergy/translations/ga.json +3 -0
- homeassistant/components/ecobee/translations/ga.json +40 -0
- homeassistant/components/ecoforest/translations/it.json +2 -2
- homeassistant/components/econet/translations/ga.json +15 -0
- homeassistant/components/ecovacs/manifest.json +1 -1
- homeassistant/components/eheimdigital/translations/ga.json +21 -0
- homeassistant/components/elevenlabs/translations/ga.json +30 -0
- homeassistant/components/elkm1/translations/ga.json +1 -0
- homeassistant/components/emoncms/translations/el.json +3 -0
- homeassistant/components/emoncms/translations/ga.json +95 -0
- homeassistant/components/energy/translations/ga.json +8 -0
- homeassistant/components/enphase_envoy/__init__.py +1 -0
- homeassistant/components/enphase_envoy/manifest.json +1 -1
- homeassistant/components/enphase_envoy/translations/cs.json +1 -0
- homeassistant/components/enphase_envoy/translations/el.json +1 -0
- homeassistant/components/enphase_envoy/translations/et.json +1 -0
- homeassistant/components/enphase_envoy/translations/ga.json +111 -1
- homeassistant/components/enphase_envoy/translations/he.json +1 -0
- homeassistant/components/enphase_envoy/translations/lt.json +1 -0
- homeassistant/components/enphase_envoy/translations/nl.json +2 -1
- homeassistant/components/enphase_envoy/translations/pt.json +1 -0
- homeassistant/components/eq3btsmart/translations/ga.json +50 -0
- homeassistant/components/esphome/translations/ga.json +26 -0
- homeassistant/components/ezviz/translations/ga.json +16 -0
- homeassistant/components/ezviz/translations/lt.json +10 -0
- homeassistant/components/fan/translations/it.json +2 -2
- homeassistant/components/feedreader/translations/ga.json +9 -0
- homeassistant/components/fibaro/translations/ga.json +19 -0
- homeassistant/components/file/translations/fr.json +3 -2
- homeassistant/components/filesize/translations/ga.json +9 -0
- homeassistant/components/filter/translations/ga.json +2 -1
- homeassistant/components/filter/translations/ja.json +30 -0
- homeassistant/components/fitbit/translations/ga.json +78 -0
- homeassistant/components/fjaraskupan/translations/ga.json +16 -0
- homeassistant/components/flexit_bacnet/translations/el.json +9 -0
- homeassistant/components/flipr/translations/ga.json +3 -1
- homeassistant/components/foscam/translations/el.json +8 -0
- homeassistant/components/fritz/translations/ga.json +8 -1
- homeassistant/components/fritzbox/translations/ga.json +10 -0
- homeassistant/components/fritzbox_callmonitor/translations/ga.json +13 -0
- homeassistant/components/fronius/translations/ga.json +25 -0
- homeassistant/components/frontend/manifest.json +1 -1
- homeassistant/components/fujitsu_fglair/translations/ga.json +18 -0
- homeassistant/components/fully_kiosk/translations/ga.json +25 -0
- homeassistant/components/fyta/translations/ga.json +27 -0
- homeassistant/components/fyta/translations/ja.json +8 -0
- homeassistant/components/garages_amsterdam/translations/ga.json +33 -0
- homeassistant/components/generic/translations/ga.json +10 -0
- homeassistant/components/generic_thermostat/translations/ga.json +22 -0
- homeassistant/components/github/translations/ga.json +24 -0
- homeassistant/components/go2rtc/translations/ga.json +8 -0
- homeassistant/components/google/translations/ca.json +1 -1
- homeassistant/components/google/translations/ga.json +3 -0
- homeassistant/components/google_assistant/translations/de.json +1 -1
- homeassistant/components/google_assistant_sdk/translations/cs.json +0 -3
- homeassistant/components/google_assistant_sdk/translations/de.json +1 -1
- homeassistant/components/google_assistant_sdk/translations/el.json +1 -1
- homeassistant/components/google_assistant_sdk/translations/en-GB.json +0 -3
- homeassistant/components/google_assistant_sdk/translations/en.json +1 -1
- homeassistant/components/google_assistant_sdk/translations/es.json +0 -3
- homeassistant/components/google_assistant_sdk/translations/et.json +1 -1
- homeassistant/components/google_assistant_sdk/translations/he.json +0 -3
- homeassistant/components/google_assistant_sdk/translations/hu.json +0 -3
- homeassistant/components/google_assistant_sdk/translations/id.json +0 -3
- homeassistant/components/google_assistant_sdk/translations/it.json +0 -3
- homeassistant/components/google_assistant_sdk/translations/ja.json +0 -3
- homeassistant/components/google_assistant_sdk/translations/lt.json +0 -3
- homeassistant/components/google_assistant_sdk/translations/nl.json +0 -3
- homeassistant/components/google_assistant_sdk/translations/pt.json +0 -3
- homeassistant/components/google_assistant_sdk/translations/ru.json +0 -3
- homeassistant/components/google_assistant_sdk/translations/sk.json +0 -3
- homeassistant/components/google_assistant_sdk/translations/sl.json +0 -3
- homeassistant/components/google_assistant_sdk/translations/sv.json +0 -3
- homeassistant/components/google_assistant_sdk/translations/tr.json +0 -3
- homeassistant/components/google_assistant_sdk/translations/uk.json +0 -3
- homeassistant/components/google_assistant_sdk/translations/zh-Hans.json +0 -3
- homeassistant/components/google_assistant_sdk/translations/zh-Hant.json +1 -1
- homeassistant/components/google_generative_ai_conversation/translations/ga.json +52 -0
- homeassistant/components/google_generative_ai_conversation/translations/he.json +30 -0
- homeassistant/components/google_generative_ai_conversation/translations/lt.json +28 -0
- homeassistant/components/google_photos/translations/ga.json +22 -0
- homeassistant/components/google_travel_time/translations/it.json +7 -0
- homeassistant/components/group/translations/he.json +1 -1
- homeassistant/components/group/translations/it.json +2 -2
- homeassistant/components/habitica/translations/el.json +6 -0
- homeassistant/components/habitica/translations/es.json +5 -5
- homeassistant/components/habitica/translations/ga.json +373 -10
- homeassistant/components/hassio/ingress.py +6 -2
- homeassistant/components/hassio/translations/ga.json +17 -0
- homeassistant/components/heos/translations/ga.json +4 -0
- homeassistant/components/heos/translations/it.json +1 -0
- homeassistant/components/history_stats/translations/el.json +2 -1
- homeassistant/components/history_stats/translations/ga.json +3 -0
- homeassistant/components/hive/translations/it.json +3 -3
- homeassistant/components/holiday/translations/ga.json +55 -0
- homeassistant/components/home_connect/translations/ga.json +439 -32
- homeassistant/components/home_connect/translations/it.json +47 -44
- homeassistant/components/home_connect/translations/ja.json +3 -0
- homeassistant/components/homeassistant/translations/ga.json +22 -0
- homeassistant/components/homeassistant/translations/it.json +24 -0
- homeassistant/components/homeassistant/translations/ja.json +17 -2
- homeassistant/components/homeassistant_hardware/translations/cs.json +2 -0
- homeassistant/components/homeassistant_hardware/translations/el.json +1 -0
- homeassistant/components/homeassistant_hardware/translations/et.json +1 -0
- homeassistant/components/homeassistant_hardware/translations/fr.json +1 -0
- homeassistant/components/homeassistant_hardware/translations/ga.json +5 -0
- homeassistant/components/homeassistant_hardware/translations/he.json +4 -0
- homeassistant/components/homeassistant_hardware/translations/lt.json +2 -0
- homeassistant/components/homeassistant_hardware/translations/mk.json +3 -0
- homeassistant/components/homeassistant_hardware/translations/pt.json +1 -0
- homeassistant/components/homeassistant_sky_connect/translations/cs.json +4 -0
- homeassistant/components/homeassistant_sky_connect/translations/el.json +2 -0
- homeassistant/components/homeassistant_sky_connect/translations/et.json +2 -0
- homeassistant/components/homeassistant_sky_connect/translations/fr.json +2 -0
- homeassistant/components/homeassistant_sky_connect/translations/ga.json +10 -0
- homeassistant/components/homeassistant_sky_connect/translations/he.json +3 -0
- homeassistant/components/homeassistant_sky_connect/translations/lt.json +4 -0
- homeassistant/components/homeassistant_sky_connect/translations/pt.json +2 -0
- homeassistant/components/homeassistant_yellow/translations/cs.json +3 -0
- homeassistant/components/homeassistant_yellow/translations/el.json +1 -0
- homeassistant/components/homeassistant_yellow/translations/et.json +1 -0
- homeassistant/components/homeassistant_yellow/translations/fr.json +1 -0
- homeassistant/components/homeassistant_yellow/translations/ga.json +5 -0
- homeassistant/components/homeassistant_yellow/translations/he.json +1 -0
- homeassistant/components/homeassistant_yellow/translations/lt.json +3 -0
- homeassistant/components/homeassistant_yellow/translations/pt.json +1 -0
- homeassistant/components/homee/translations/it.json +1 -1
- homeassistant/components/homee/translations/ja.json +26 -0
- homeassistant/components/homewizard/translations/ga.json +14 -1
- homeassistant/components/http/ban.py +1 -1
- homeassistant/components/http/translations/ga.json +8 -0
- homeassistant/components/humidifier/translations/ga.json +7 -0
- homeassistant/components/humidifier/translations/it.json +3 -3
- homeassistant/components/husqvarna_automower/translations/ga.json +35 -0
- homeassistant/components/husqvarna_automower/translations/it.json +1 -1
- homeassistant/components/husqvarna_automower_ble/translations/ga.json +18 -0
- homeassistant/components/idasen_desk/translations/ga.json +11 -0
- homeassistant/components/image/translations/ga.json +14 -0
- homeassistant/components/imap/translations/ga.json +50 -0
- homeassistant/components/immich/translations/he.json +5 -0
- homeassistant/components/immich/translations/nl.json +5 -0
- homeassistant/components/incomfort/translations/it.json +1 -1
- homeassistant/components/input_boolean/translations/it.json +2 -2
- homeassistant/components/input_select/translations/el.json +1 -0
- homeassistant/components/insteon/translations/el.json +1 -0
- homeassistant/components/intellifire/translations/ga.json +12 -0
- homeassistant/components/iron_os/translations/ga.json +121 -1
- homeassistant/components/iron_os/translations/it.json +5 -5
- homeassistant/components/iskra/translations/ga.json +42 -0
- homeassistant/components/ista_ecotrend/translations/de.json +1 -1
- homeassistant/components/ista_ecotrend/translations/ga.json +24 -0
- homeassistant/components/ituran/translations/ga.json +57 -0
- homeassistant/components/jellyfin/translations/ga.json +10 -0
- homeassistant/components/juicenet/translations/ga.json +8 -0
- homeassistant/components/jvc_projector/translations/it.json +1 -1
- homeassistant/components/keenetic_ndms2/translations/ga.json +7 -0
- homeassistant/components/keenetic_ndms2/translations/he.json +5 -0
- homeassistant/components/kitchen_sink/translations/ga.json +13 -0
- homeassistant/components/knx/translations/ga.json +17 -0
- homeassistant/components/lamarzocco/translations/el.json +1 -0
- homeassistant/components/lamarzocco/translations/ga.json +70 -0
- homeassistant/components/lametric/translations/ga.json +8 -0
- homeassistant/components/lcn/translations/cs.json +1 -1
- homeassistant/components/lcn/translations/de.json +1 -1
- homeassistant/components/lcn/translations/el.json +1 -1
- homeassistant/components/lcn/translations/en-GB.json +1 -1
- homeassistant/components/lcn/translations/en.json +1 -1
- homeassistant/components/lcn/translations/es.json +1 -1
- homeassistant/components/lcn/translations/et.json +1 -1
- homeassistant/components/lcn/translations/ga.json +143 -0
- homeassistant/components/lcn/translations/hu.json +0 -3
- homeassistant/components/lcn/translations/ja.json +0 -3
- homeassistant/components/lcn/translations/lt.json +1 -1
- homeassistant/components/lcn/translations/pt-BR.json +0 -3
- homeassistant/components/lcn/translations/pt.json +1 -1
- homeassistant/components/lcn/translations/ru.json +0 -3
- homeassistant/components/lcn/translations/sk.json +1 -1
- homeassistant/components/lcn/translations/sv.json +0 -3
- homeassistant/components/lcn/translations/tr.json +0 -3
- homeassistant/components/lcn/translations/zh-Hans.json +1 -1
- homeassistant/components/lcn/translations/zh-Hant.json +1 -1
- homeassistant/components/lektrico/translations/ga.json +76 -1
- homeassistant/components/lg_thinq/translations/cs.json +3 -1
- homeassistant/components/lg_thinq/translations/el.json +15 -1
- homeassistant/components/lg_thinq/translations/et.json +3 -1
- homeassistant/components/lg_thinq/translations/ga.json +818 -15
- homeassistant/components/lg_thinq/translations/he.json +3 -1
- homeassistant/components/lg_thinq/translations/it.json +16 -16
- homeassistant/components/lg_thinq/translations/lt.json +3 -1
- homeassistant/components/lg_thinq/translations/pt.json +3 -1
- homeassistant/components/lidarr/translations/ga.json +9 -0
- homeassistant/components/light/translations/it.json +3 -3
- homeassistant/components/linkplay/translations/ga.json +24 -0
- homeassistant/components/litterrobot/translations/cs.json +1 -0
- homeassistant/components/litterrobot/translations/el.json +1 -0
- homeassistant/components/litterrobot/translations/et.json +1 -0
- homeassistant/components/litterrobot/translations/ga.json +2 -1
- homeassistant/components/litterrobot/translations/he.json +1 -0
- homeassistant/components/litterrobot/translations/it.json +1 -1
- homeassistant/components/litterrobot/translations/ja.json +4 -0
- homeassistant/components/litterrobot/translations/lt.json +1 -0
- homeassistant/components/litterrobot/translations/pt.json +1 -0
- homeassistant/components/litterrobot/translations/sensor.it.json +1 -1
- homeassistant/components/litterrobot/translations/sk.json +1 -0
- homeassistant/components/local_calendar/translations/ga.json +25 -0
- homeassistant/components/local_file/translations/ga.json +38 -0
- homeassistant/components/lock/translations/he.json +1 -1
- homeassistant/components/lutron_caseta/translations/it.json +2 -2
- homeassistant/components/lyric/translations/it.json +3 -0
- homeassistant/components/lyric/translations/ja.json +6 -0
- homeassistant/components/madvr/translations/ga.json +7 -0
- homeassistant/components/mastodon/translations/el.json +2 -1
- homeassistant/components/mastodon/translations/ga.json +24 -0
- homeassistant/components/matter/translations/ga.json +67 -1
- homeassistant/components/matter/translations/he.json +32 -0
- homeassistant/components/matter/translations/it.json +4 -4
- homeassistant/components/matter/translations/ja.json +3 -0
- homeassistant/components/mealie/translations/ga.json +47 -4
- homeassistant/components/meater/translations/he.json +46 -1
- homeassistant/components/meater/translations/ja.json +10 -1
- homeassistant/components/media_player/translations/el.json +13 -1
- homeassistant/components/media_player/translations/it.json +6 -6
- homeassistant/components/melcloud/translations/ga.json +13 -0
- homeassistant/components/miele/translations/ga.json +24 -1
- homeassistant/components/miele/translations/he.json +9 -0
- homeassistant/components/miele/translations/it.json +5 -2
- homeassistant/components/miele/translations/ja.json +12 -1
- homeassistant/components/miele/translations/sk.json +1 -0
- homeassistant/components/modbus/translations/el.json +1 -0
- homeassistant/components/mold_indicator/translations/ga.json +36 -0
- homeassistant/components/monarch_money/translations/ga.json +18 -0
- homeassistant/components/motionmount/translations/ga.json +3 -0
- homeassistant/components/mqtt/translations/bg.json +10 -0
- homeassistant/components/mqtt/translations/cs.json +11 -0
- homeassistant/components/mqtt/translations/de.json +2 -2
- homeassistant/components/mqtt/translations/ga.json +39 -1
- homeassistant/components/mqtt/translations/he.json +37 -0
- homeassistant/components/mqtt/translations/it.json +9 -2
- homeassistant/components/mqtt/translations/lt.json +37 -0
- homeassistant/components/mqtt/translations/mk.json +9 -0
- homeassistant/components/mqtt/translations/nl.json +1 -1
- homeassistant/components/mqtt/translations/pt.json +11 -0
- homeassistant/components/music_assistant/manifest.json +1 -1
- homeassistant/components/music_assistant/media_player.py +0 -2
- homeassistant/components/music_assistant/translations/ga.json +116 -1
- homeassistant/components/myuplink/translations/de.json +1 -1
- homeassistant/components/myuplink/translations/ga.json +30 -0
- homeassistant/components/nam/translations/ga.json +7 -0
- homeassistant/components/nasweb/translations/el.json +12 -1
- homeassistant/components/nasweb/translations/ga.json +39 -0
- homeassistant/components/ness_alarm/translations/el.json +4 -0
- homeassistant/components/nest/translations/ga.json +21 -0
- homeassistant/components/nest/translations/ja.json +3 -0
- homeassistant/components/netatmo/translations/ga.json +3 -1
- homeassistant/components/nextdns/translations/ga.json +49 -0
- homeassistant/components/nice_go/translations/ga.json +38 -0
- homeassistant/components/niko_home_control/translations/ga.json +12 -0
- homeassistant/components/nordpool/coordinator.py +3 -0
- homeassistant/components/nordpool/translations/ga.json +132 -0
- homeassistant/components/ntfy/translations/ga.json +82 -0
- homeassistant/components/ntfy/translations/he.json +43 -1
- homeassistant/components/ntfy/translations/ja.json +30 -0
- homeassistant/components/number/translations/ga.json +6 -0
- homeassistant/components/nut/translations/it.json +1 -1
- homeassistant/components/nyt_games/translations/ga.json +45 -0
- homeassistant/components/ohme/translations/ga.json +33 -1
- homeassistant/components/ollama/__init__.py +30 -4
- homeassistant/components/ollama/config_flow.py +164 -135
- homeassistant/components/ollama/conversation.py +8 -243
- homeassistant/components/ollama/entity.py +261 -0
- homeassistant/components/ollama/strings.json +12 -10
- homeassistant/components/ollama/translations/bg.json +3 -1
- homeassistant/components/ollama/translations/ca.json +0 -10
- homeassistant/components/ollama/translations/cs.json +12 -10
- homeassistant/components/ollama/translations/de.json +12 -10
- homeassistant/components/ollama/translations/el.json +12 -10
- homeassistant/components/ollama/translations/en-GB.json +0 -10
- homeassistant/components/ollama/translations/en.json +12 -10
- homeassistant/components/ollama/translations/es.json +12 -10
- homeassistant/components/ollama/translations/et.json +12 -10
- homeassistant/components/ollama/translations/fi.json +0 -7
- homeassistant/components/ollama/translations/fr.json +12 -10
- homeassistant/components/ollama/translations/ga.json +8 -1
- homeassistant/components/ollama/translations/he.json +21 -0
- homeassistant/components/ollama/translations/hu.json +1 -10
- homeassistant/components/ollama/translations/it.json +1 -8
- homeassistant/components/ollama/translations/ja.json +11 -10
- homeassistant/components/ollama/translations/lt.json +12 -10
- homeassistant/components/ollama/translations/pt-BR.json +0 -3
- homeassistant/components/ollama/translations/pt.json +12 -10
- homeassistant/components/ollama/translations/ru.json +1 -10
- homeassistant/components/ollama/translations/sk.json +12 -10
- homeassistant/components/ollama/translations/sv.json +1 -10
- homeassistant/components/ollama/translations/tr.json +0 -10
- homeassistant/components/ollama/translations/zh-Hans.json +12 -10
- homeassistant/components/ollama/translations/zh-Hant.json +12 -10
- homeassistant/components/onewire/translations/ga.json +5 -0
- homeassistant/components/onkyo/translations/ga.json +31 -4
- homeassistant/components/openai_conversation/translations/ga.json +49 -0
- homeassistant/components/openai_conversation/translations/he.json +25 -0
- homeassistant/components/openai_conversation/translations/ja.json +11 -0
- homeassistant/components/opentherm_gw/translations/bg.json +3 -0
- homeassistant/components/opentherm_gw/translations/cs.json +3 -0
- homeassistant/components/opentherm_gw/translations/el.json +6 -0
- homeassistant/components/opentherm_gw/translations/et.json +3 -0
- homeassistant/components/opentherm_gw/translations/fr.json +3 -0
- homeassistant/components/opentherm_gw/translations/ga.json +39 -0
- homeassistant/components/opentherm_gw/translations/lt.json +3 -0
- homeassistant/components/opentherm_gw/translations/mk.json +7 -0
- homeassistant/components/opentherm_gw/translations/pt.json +3 -0
- homeassistant/components/osoenergy/translations/ga.json +125 -0
- homeassistant/components/osoenergy/translations/it.json +2 -2
- homeassistant/components/otbr/translations/el.json +3 -0
- homeassistant/components/otbr/translations/ga.json +7 -0
- homeassistant/components/overkiz/translations/cs.json +1 -0
- homeassistant/components/overkiz/translations/de.json +1 -1
- homeassistant/components/overkiz/translations/el.json +1 -0
- homeassistant/components/overkiz/translations/et.json +1 -0
- homeassistant/components/overkiz/translations/he.json +1 -0
- homeassistant/components/overkiz/translations/lt.json +1 -0
- homeassistant/components/overkiz/translations/pt.json +1 -0
- homeassistant/components/ovo_energy/translations/ga.json +10 -0
- homeassistant/components/p1_monitor/translations/ga.json +11 -0
- homeassistant/components/palazzetti/translations/ga.json +95 -1
- homeassistant/components/palazzetti/translations/it.json +1 -1
- homeassistant/components/paperless_ngx/translations/he.json +9 -2
- homeassistant/components/paperless_ngx/translations/ja.json +49 -0
- homeassistant/components/peblar/translations/ga.json +34 -5
- homeassistant/components/pegel_online/translations/cs.json +2 -1
- homeassistant/components/pegel_online/translations/ga.json +7 -0
- homeassistant/components/pegel_online/translations/lt.json +2 -1
- homeassistant/components/pegel_online/translations/pt.json +2 -1
- homeassistant/components/permobil/translations/ga.json +11 -0
- homeassistant/components/philips_js/translations/ga.json +7 -0
- homeassistant/components/pi_hole/translations/ga.json +30 -0
- homeassistant/components/playstation_network/translations/el.json +1 -1
- homeassistant/components/playstation_network/translations/en.json +1 -1
- homeassistant/components/playstation_network/translations/et.json +1 -1
- homeassistant/components/playstation_network/translations/ga.json +34 -3
- homeassistant/components/playstation_network/translations/he.json +21 -0
- homeassistant/components/playstation_network/translations/hu.json +0 -3
- homeassistant/components/playstation_network/translations/ja.json +29 -0
- homeassistant/components/playstation_network/translations/lt.json +29 -0
- homeassistant/components/playstation_network/translations/mk.json +0 -3
- homeassistant/components/playstation_network/translations/nl.json +0 -3
- homeassistant/components/playstation_network/translations/pl.json +0 -3
- homeassistant/components/playstation_network/translations/sk.json +1 -1
- homeassistant/components/playstation_network/translations/sl.json +73 -0
- homeassistant/components/playstation_network/translations/sv.json +0 -3
- homeassistant/components/playstation_network/translations/zh-Hant.json +1 -1
- homeassistant/components/plugwise/translations/ga.json +18 -0
- homeassistant/components/plugwise/translations/it.json +3 -3
- homeassistant/components/point/translations/ga.json +6 -0
- homeassistant/components/powerfox/translations/ga.json +43 -0
- homeassistant/components/proximity/translations/cs.json +25 -1
- homeassistant/components/proximity/translations/el.json +25 -1
- homeassistant/components/proximity/translations/fr.json +24 -1
- homeassistant/components/proximity/translations/lt.json +25 -1
- homeassistant/components/proximity/translations/nl.json +3 -0
- homeassistant/components/proximity/translations/pt.json +25 -1
- homeassistant/components/qbittorrent/translations/ga.json +12 -0
- homeassistant/components/qnap_qsw/translations/ga.json +9 -0
- homeassistant/components/rainbird/translations/ga.json +26 -0
- homeassistant/components/random/translations/ga.json +4 -1
- homeassistant/components/remote/translations/it.json +2 -2
- homeassistant/components/remote_calendar/client.py +12 -0
- homeassistant/components/remote_calendar/config_flow.py +9 -3
- homeassistant/components/remote_calendar/coordinator.py +11 -4
- homeassistant/components/remote_calendar/strings.json +5 -1
- homeassistant/components/remote_calendar/translations/cs.json +6 -2
- homeassistant/components/remote_calendar/translations/de.json +6 -2
- homeassistant/components/remote_calendar/translations/en-GB.json +0 -3
- homeassistant/components/remote_calendar/translations/en.json +6 -2
- homeassistant/components/remote_calendar/translations/es.json +6 -2
- homeassistant/components/remote_calendar/translations/et.json +6 -2
- homeassistant/components/remote_calendar/translations/fi.json +0 -3
- homeassistant/components/remote_calendar/translations/fr.json +0 -3
- homeassistant/components/remote_calendar/translations/ga.json +2 -2
- homeassistant/components/remote_calendar/translations/he.json +0 -3
- homeassistant/components/remote_calendar/translations/hu.json +0 -3
- homeassistant/components/remote_calendar/translations/lt.json +6 -2
- homeassistant/components/remote_calendar/translations/nl.json +0 -3
- homeassistant/components/remote_calendar/translations/pt.json +0 -3
- homeassistant/components/remote_calendar/translations/ru.json +0 -3
- homeassistant/components/remote_calendar/translations/sk.json +6 -2
- homeassistant/components/remote_calendar/translations/sl.json +0 -3
- homeassistant/components/remote_calendar/translations/sv.json +0 -3
- homeassistant/components/remote_calendar/translations/tr.json +0 -3
- homeassistant/components/remote_calendar/translations/zh-Hans.json +6 -2
- homeassistant/components/remote_calendar/translations/zh-Hant.json +6 -2
- homeassistant/components/renault/translations/ga.json +40 -0
- homeassistant/components/renson/translations/it.json +4 -4
- homeassistant/components/reolink/translations/el.json +3 -0
- homeassistant/components/reolink/translations/ga.json +69 -0
- homeassistant/components/reolink/translations/it.json +15 -12
- homeassistant/components/reolink/translations/ja.json +6 -0
- homeassistant/components/rfxtrx/translations/it.json +2 -2
- homeassistant/components/ring/translations/ga.json +49 -1
- homeassistant/components/roborock/translations/ga.json +3 -0
- homeassistant/components/roborock/translations/it.json +2 -2
- homeassistant/components/roku/translations/ga.json +19 -0
- homeassistant/components/roomba/translations/ga.json +9 -0
- homeassistant/components/russound_rio/translations/el.json +8 -0
- homeassistant/components/russound_rio/translations/ga.json +45 -0
- homeassistant/components/russound_rio/translations/nl.json +7 -0
- homeassistant/components/sabnzbd/translations/de.json +1 -1
- homeassistant/components/sabnzbd/translations/ga.json +29 -0
- homeassistant/components/samsungtv/config_flow.py +15 -10
- homeassistant/components/schedule/translations/it.json +2 -2
- homeassistant/components/schlage/translations/ga.json +13 -1
- homeassistant/components/scrape/translations/ga.json +6 -0
- homeassistant/components/scrape/translations/it.json +1 -0
- homeassistant/components/screenlogic/translations/ga.json +12 -1
- homeassistant/components/script/translations/it.json +2 -2
- homeassistant/components/sense/translations/ga.json +21 -0
- homeassistant/components/sensibo/translations/el.json +9 -1
- homeassistant/components/sensibo/translations/it.json +28 -28
- homeassistant/components/sensibo/translations/pt-BR.json +4 -1
- homeassistant/components/sensibo/translations/sv.json +3 -3
- homeassistant/components/sensor/translations/ga.json +16 -0
- homeassistant/components/sensor/translations/it.json +3 -2
- homeassistant/components/sensoterra/translations/ga.json +22 -0
- homeassistant/components/seventeentrack/translations/ga.json +13 -0
- homeassistant/components/shelly/__init__.py +8 -1
- homeassistant/components/shelly/const.py +3 -0
- homeassistant/components/shelly/repairs.py +87 -4
- homeassistant/components/shelly/strings.json +14 -0
- homeassistant/components/shelly/translations/bg.json +7 -0
- homeassistant/components/shelly/translations/cs.json +14 -0
- homeassistant/components/shelly/translations/de.json +14 -0
- homeassistant/components/shelly/translations/el.json +14 -0
- homeassistant/components/shelly/translations/en.json +14 -0
- homeassistant/components/shelly/translations/es.json +14 -0
- homeassistant/components/shelly/translations/et.json +14 -0
- homeassistant/components/shelly/translations/fr.json +7 -0
- homeassistant/components/shelly/translations/ga.json +19 -1
- homeassistant/components/shelly/translations/he.json +7 -0
- homeassistant/components/shelly/translations/ja.json +14 -0
- homeassistant/components/shelly/translations/lt.json +14 -0
- homeassistant/components/shelly/translations/pt.json +14 -0
- homeassistant/components/shelly/translations/sk.json +14 -0
- homeassistant/components/shelly/translations/zh-Hans.json +14 -0
- homeassistant/components/shelly/translations/zh-Hant.json +14 -0
- homeassistant/components/siren/translations/it.json +2 -2
- homeassistant/components/sky_remote/translations/ga.json +12 -0
- homeassistant/components/sleepiq/translations/it.json +1 -1
- homeassistant/components/slide_local/translations/ga.json +45 -0
- homeassistant/components/sma/config_flow.py +30 -1
- homeassistant/components/smarla/translations/it.json +9 -0
- homeassistant/components/smarla/translations/ja.json +24 -0
- homeassistant/components/smartthings/translations/ga.json +3 -0
- homeassistant/components/smartthings/translations/he.json +19 -0
- homeassistant/components/smartthings/translations/it.json +9 -9
- homeassistant/components/smartthings/translations/ja.json +5 -0
- homeassistant/components/smarty/translations/el.json +5 -0
- homeassistant/components/smarty/translations/ga.json +54 -0
- homeassistant/components/smhi/translations/ga.json +9 -0
- homeassistant/components/smlight/translations/el.json +2 -1
- homeassistant/components/smlight/translations/ga.json +90 -0
- homeassistant/components/snips/translations/el.json +1 -0
- homeassistant/components/solarlog/translations/ga.json +50 -0
- homeassistant/components/sonos/translations/ga.json +9 -0
- homeassistant/components/sonos/translations/lt.json +9 -0
- homeassistant/components/spider/translations/ga.json +8 -0
- homeassistant/components/sql/translations/it.json +1 -0
- homeassistant/components/squeezebox/translations/ga.json +40 -0
- homeassistant/components/squeezebox/translations/it.json +5 -0
- homeassistant/components/squeezebox/translations/ja.json +8 -0
- homeassistant/components/starline/translations/ga.json +8 -0
- homeassistant/components/starlink/translations/ga.json +12 -0
- homeassistant/components/statistics/translations/ga.json +3 -0
- homeassistant/components/stookwijzer/translations/ga.json +34 -0
- homeassistant/components/subaru/translations/cs.json +2 -0
- homeassistant/components/subaru/translations/ga.json +7 -0
- homeassistant/components/subaru/translations/lt.json +2 -0
- homeassistant/components/subaru/translations/mk.json +12 -0
- homeassistant/components/suez_water/translations/ga.json +24 -0
- homeassistant/components/sun/translations/ja.json +6 -0
- homeassistant/components/swiss_public_transport/translations/ga.json +36 -2
- homeassistant/components/switch/translations/it.json +6 -6
- homeassistant/components/switchbot/translations/cs.json +1 -0
- homeassistant/components/switchbot/translations/el.json +1 -0
- homeassistant/components/switchbot/translations/et.json +1 -0
- homeassistant/components/switchbot/translations/ga.json +38 -2
- homeassistant/components/switchbot/translations/he.json +22 -0
- homeassistant/components/switchbot/translations/it.json +1 -0
- homeassistant/components/switchbot/translations/lt.json +54 -0
- homeassistant/components/switchbot/translations/nl.json +1 -0
- homeassistant/components/switchbot/translations/pt.json +1 -0
- homeassistant/components/switchbot/translations/sk.json +1 -0
- homeassistant/components/switchbot/translations/zh-Hant.json +1 -0
- homeassistant/components/switcher_kis/translations/ga.json +14 -2
- homeassistant/components/system_bridge/translations/ga.json +7 -0
- homeassistant/components/tami4/translations/ga.json +9 -0
- homeassistant/components/tedee/translations/ga.json +33 -0
- homeassistant/components/telegram_bot/bot.py +3 -3
- homeassistant/components/telegram_bot/config_flow.py +0 -2
- homeassistant/components/telegram_bot/services.yaml +5 -0
- homeassistant/components/telegram_bot/translations/bg.json +10 -0
- homeassistant/components/telegram_bot/translations/es.json +1 -1
- homeassistant/components/telegram_bot/translations/ga.json +28 -0
- homeassistant/components/telegram_bot/translations/he.json +24 -1
- homeassistant/components/telegram_bot/translations/it.json +13 -0
- homeassistant/components/telegram_bot/translations/ja.json +103 -2
- homeassistant/components/telegram_bot/translations/lt.json +30 -0
- homeassistant/components/telegram_bot/translations/mk.json +5 -0
- homeassistant/components/template/translations/ga.json +50 -0
- homeassistant/components/template/translations/it.json +1 -0
- homeassistant/components/tesla_fleet/translations/cs.json +3 -0
- homeassistant/components/tesla_fleet/translations/el.json +3 -0
- homeassistant/components/tesla_fleet/translations/et.json +3 -0
- homeassistant/components/tesla_fleet/translations/ga.json +122 -0
- homeassistant/components/tesla_fleet/translations/he.json +4 -0
- homeassistant/components/tesla_fleet/translations/it.json +8 -8
- homeassistant/components/tesla_fleet/translations/ja.json +2 -0
- homeassistant/components/tesla_fleet/translations/lt.json +3 -0
- homeassistant/components/tesla_fleet/translations/mk.json +3 -0
- homeassistant/components/tesla_fleet/translations/nl.json +3 -0
- homeassistant/components/tesla_fleet/translations/pt.json +3 -0
- homeassistant/components/teslemetry/translations/ga.json +106 -0
- homeassistant/components/teslemetry/translations/he.json +3 -0
- homeassistant/components/teslemetry/translations/it.json +16 -16
- homeassistant/components/tessie/translations/ga.json +5 -0
- homeassistant/components/tessie/translations/it.json +9 -9
- homeassistant/components/thermopro/manifest.json +1 -1
- homeassistant/components/thermopro/translations/cs.json +7 -0
- homeassistant/components/thermopro/translations/lt.json +7 -0
- homeassistant/components/thermopro/translations/pt.json +7 -0
- homeassistant/components/tibber/translations/ga.json +7 -0
- homeassistant/components/tilt_pi/translations/ga.json +18 -0
- homeassistant/components/tilt_pi/translations/he.json +21 -0
- homeassistant/components/timer/translations/ga.json +3 -0
- homeassistant/components/totalconnect/translations/ga.json +44 -0
- homeassistant/components/tplink/translations/ga.json +15 -0
- homeassistant/components/tplink_omada/translations/ga.json +25 -1
- homeassistant/components/tradfri/translations/ga.json +7 -0
- homeassistant/components/transmission/translations/ga.json +31 -0
- homeassistant/components/trend/translations/ga.json +3 -0
- homeassistant/components/triggercmd/translations/ga.json +7 -0
- homeassistant/components/tuya/translations/ga.json +8 -0
- homeassistant/components/tuya/translations/it.json +20 -7
- homeassistant/components/tuya/translations/ja.json +6 -0
- homeassistant/components/tuya/translations/select.it.json +5 -5
- homeassistant/components/twentemilieu/translations/ga.json +13 -0
- homeassistant/components/twinkly/translations/it.json +1 -1
- homeassistant/components/twitch/translations/ga.json +44 -0
- homeassistant/components/unifi/manifest.json +1 -1
- homeassistant/components/unifi/translations/ga.json +13 -0
- homeassistant/components/unifiprotect/config_flow.py +1 -1
- homeassistant/components/unifiprotect/translations/ga.json +23 -0
- homeassistant/components/uptimerobot/translations/it.json +5 -0
- homeassistant/components/uptimerobot/translations/ja.json +5 -0
- homeassistant/components/utility_meter/translations/ga.json +7 -0
- homeassistant/components/vacuum/translations/it.json +2 -2
- homeassistant/components/vallox/translations/ga.json +25 -0
- homeassistant/components/vegehub/translations/bg.json +1 -3
- homeassistant/components/vegehub/translations/cs.json +2 -2
- homeassistant/components/vegehub/translations/de.json +2 -2
- homeassistant/components/vegehub/translations/el.json +1 -3
- homeassistant/components/vegehub/translations/en-GB.json +8 -0
- homeassistant/components/vegehub/translations/en.json +2 -2
- homeassistant/components/vegehub/translations/es.json +2 -2
- homeassistant/components/vegehub/translations/et.json +2 -2
- homeassistant/components/vegehub/translations/ga.json +39 -0
- homeassistant/components/vegehub/translations/he.json +16 -0
- homeassistant/components/vegehub/translations/hu.json +1 -3
- homeassistant/components/vegehub/translations/ja.json +1 -3
- homeassistant/components/vegehub/translations/lt.json +2 -2
- homeassistant/components/vegehub/translations/pt.json +2 -2
- homeassistant/components/vegehub/translations/ru.json +0 -3
- homeassistant/components/vegehub/translations/sk.json +2 -2
- homeassistant/components/vegehub/translations/sv.json +1 -3
- homeassistant/components/vegehub/translations/zh-Hans.json +2 -2
- homeassistant/components/vegehub/translations/zh-Hant.json +2 -2
- homeassistant/components/velbus/translations/ga.json +3 -0
- homeassistant/components/venstar/manifest.json +1 -1
- homeassistant/components/vesync/translations/ga.json +4 -1
- homeassistant/components/vesync/translations/it.json +2 -2
- homeassistant/components/vicare/translations/ga.json +35 -0
- homeassistant/components/voip/translations/ga.json +12 -0
- homeassistant/components/wallbox/translations/ga.json +3 -0
- homeassistant/components/wallbox/translations/it.json +1 -1
- homeassistant/components/water_heater/translations/ga.json +3 -0
- homeassistant/components/water_heater/translations/it.json +3 -3
- homeassistant/components/watergate/translations/ga.json +10 -0
- homeassistant/components/waze_travel_time/translations/ga.json +14 -0
- homeassistant/components/weatherflow_cloud/translations/es.json +2 -2
- homeassistant/components/weatherflow_cloud/translations/ga.json +1 -0
- homeassistant/components/webdav/translations/cs.json +1 -0
- homeassistant/components/webdav/translations/el.json +1 -0
- homeassistant/components/webdav/translations/et.json +1 -0
- homeassistant/components/webdav/translations/fr.json +1 -0
- homeassistant/components/webdav/translations/ga.json +1 -0
- homeassistant/components/webdav/translations/lt.json +1 -0
- homeassistant/components/webdav/translations/mk.json +7 -0
- homeassistant/components/webdav/translations/pt.json +1 -0
- homeassistant/components/weheat/translations/ga.json +62 -0
- homeassistant/components/whirlpool/translations/cs.json +1 -0
- homeassistant/components/whirlpool/translations/el.json +1 -0
- homeassistant/components/whirlpool/translations/et.json +1 -0
- homeassistant/components/whirlpool/translations/he.json +2 -1
- homeassistant/components/whirlpool/translations/lt.json +1 -0
- homeassistant/components/whirlpool/translations/pt.json +1 -0
- homeassistant/components/withings/translations/ga.json +3 -0
- homeassistant/components/withings/translations/it.json +3 -0
- homeassistant/components/withings/translations/ja.json +6 -0
- homeassistant/components/wled/translations/it.json +2 -2
- homeassistant/components/wmspro/translations/ga.json +12 -0
- homeassistant/components/wolflink/translations/it.json +2 -2
- homeassistant/components/workday/translations/ga.json +7 -0
- homeassistant/components/wyoming/translations/it.json +1 -1
- homeassistant/components/xbox/translations/ja.json +6 -0
- homeassistant/components/xiaomi_ble/translations/ga.json +21 -0
- homeassistant/components/xiaomi_miio/translations/es.json +1 -1
- homeassistant/components/xiaomi_miio/translations/ga.json +105 -0
- homeassistant/components/xiaomi_miio/translations/he.json +29 -6
- homeassistant/components/xiaomi_miio/translations/it.json +1 -1
- homeassistant/components/yale/translations/ja.json +6 -0
- homeassistant/components/yale_smart_alarm/translations/el.json +2 -1
- homeassistant/components/yale_smart_alarm/translations/ga.json +11 -0
- homeassistant/components/yale_smart_alarm/translations/it.json +1 -1
- homeassistant/components/yamaha_musiccast/translations/it.json +1 -1
- homeassistant/components/yeelight/translations/it.json +1 -1
- homeassistant/components/yolink/translations/it.json +1 -1
- homeassistant/components/yolink/translations/ja.json +6 -0
- homeassistant/components/youtube/translations/ga.json +14 -0
- homeassistant/components/zha/manifest.json +1 -1
- homeassistant/components/zha/translations/ga.json +165 -0
- homeassistant/components/zha/translations/he.json +13 -0
- homeassistant/components/zha/translations/it.json +10 -2
- homeassistant/components/zha/translations/ja.json +25 -2
- homeassistant/components/zha/translations/lt.json +50 -0
- homeassistant/components/zwave_js/strings.json +11 -11
- homeassistant/components/zwave_js/translations/bg.json +6 -20
- homeassistant/components/zwave_js/translations/ca.json +0 -6
- homeassistant/components/zwave_js/translations/cs.json +37 -4
- homeassistant/components/zwave_js/translations/de.json +13 -13
- homeassistant/components/zwave_js/translations/el.json +11 -15
- homeassistant/components/zwave_js/translations/en-GB.json +11 -15
- homeassistant/components/zwave_js/translations/en.json +13 -13
- homeassistant/components/zwave_js/translations/es.json +12 -12
- homeassistant/components/zwave_js/translations/et.json +12 -12
- homeassistant/components/zwave_js/translations/fi.json +0 -15
- homeassistant/components/zwave_js/translations/ga.json +23 -20
- homeassistant/components/zwave_js/translations/hu.json +0 -27
- homeassistant/components/zwave_js/translations/id.json +0 -4
- homeassistant/components/zwave_js/translations/it.json +1 -5
- homeassistant/components/zwave_js/translations/ja.json +0 -4
- homeassistant/components/zwave_js/translations/ko.json +0 -4
- homeassistant/components/zwave_js/translations/lt.json +44 -11
- homeassistant/components/zwave_js/translations/mk.json +16 -7
- homeassistant/components/zwave_js/translations/pt.json +43 -15
- homeassistant/components/zwave_js/translations/ru.json +0 -25
- homeassistant/components/zwave_js/translations/sk.json +13 -13
- homeassistant/components/zwave_js/translations/sv.json +0 -27
- homeassistant/components/zwave_js/translations/tr.json +0 -17
- homeassistant/components/zwave_js/translations/vi.json +0 -4
- homeassistant/components/zwave_js/translations/zh-Hans.json +12 -12
- homeassistant/components/zwave_js/translations/zh-Hant.json +12 -12
- homeassistant/components/zwave_me/translations/de.json +1 -1
- homeassistant/const.py +1 -1
- homeassistant/package_constraints.txt +2 -2
- {homeassistant-2025.7.0b8.dist-info → homeassistant-2025.7.1.dist-info}/METADATA +2 -2
- {homeassistant-2025.7.0b8.dist-info → homeassistant-2025.7.1.dist-info}/RECORD +775 -655
- homeassistant/components/zwave_js/translations/sq.json +0 -7
- {homeassistant-2025.7.0b8.dist-info → homeassistant-2025.7.1.dist-info}/WHEEL +0 -0
- {homeassistant-2025.7.0b8.dist-info → homeassistant-2025.7.1.dist-info}/entry_points.txt +0 -0
- {homeassistant-2025.7.0b8.dist-info → homeassistant-2025.7.1.dist-info}/licenses/LICENSE.md +0 -0
- {homeassistant-2025.7.0b8.dist-info → homeassistant-2025.7.1.dist-info}/licenses/homeassistant/backports/LICENSE.Python +0 -0
- {homeassistant-2025.7.0b8.dist-info → homeassistant-2025.7.1.dist-info}/top_level.txt +0 -0
|
@@ -2,41 +2,18 @@
|
|
|
2
2
|
|
|
3
3
|
from __future__ import annotations
|
|
4
4
|
|
|
5
|
-
from
|
|
6
|
-
import json
|
|
7
|
-
import logging
|
|
8
|
-
from typing import Any, Literal
|
|
9
|
-
|
|
10
|
-
import ollama
|
|
11
|
-
from voluptuous_openapi import convert
|
|
5
|
+
from typing import Literal
|
|
12
6
|
|
|
13
7
|
from homeassistant.components import assist_pipeline, conversation
|
|
14
8
|
from homeassistant.config_entries import ConfigEntry, ConfigSubentry
|
|
15
9
|
from homeassistant.const import CONF_LLM_HASS_API, MATCH_ALL
|
|
16
10
|
from homeassistant.core import HomeAssistant
|
|
17
|
-
from homeassistant.
|
|
18
|
-
from homeassistant.helpers import device_registry as dr, intent, llm
|
|
11
|
+
from homeassistant.helpers import intent
|
|
19
12
|
from homeassistant.helpers.entity_platform import AddConfigEntryEntitiesCallback
|
|
20
13
|
|
|
21
14
|
from . import OllamaConfigEntry
|
|
22
|
-
from .const import
|
|
23
|
-
|
|
24
|
-
CONF_MAX_HISTORY,
|
|
25
|
-
CONF_MODEL,
|
|
26
|
-
CONF_NUM_CTX,
|
|
27
|
-
CONF_PROMPT,
|
|
28
|
-
CONF_THINK,
|
|
29
|
-
DEFAULT_KEEP_ALIVE,
|
|
30
|
-
DEFAULT_MAX_HISTORY,
|
|
31
|
-
DEFAULT_NUM_CTX,
|
|
32
|
-
DOMAIN,
|
|
33
|
-
)
|
|
34
|
-
from .models import MessageHistory, MessageRole
|
|
35
|
-
|
|
36
|
-
# Max number of back and forth with the LLM to generate a response
|
|
37
|
-
MAX_TOOL_ITERATIONS = 10
|
|
38
|
-
|
|
39
|
-
_LOGGER = logging.getLogger(__name__)
|
|
15
|
+
from .const import CONF_PROMPT, DOMAIN
|
|
16
|
+
from .entity import OllamaBaseLLMEntity
|
|
40
17
|
|
|
41
18
|
|
|
42
19
|
async def async_setup_entry(
|
|
@@ -55,129 +32,10 @@ async def async_setup_entry(
|
|
|
55
32
|
)
|
|
56
33
|
|
|
57
34
|
|
|
58
|
-
def _format_tool(
|
|
59
|
-
tool: llm.Tool, custom_serializer: Callable[[Any], Any] | None
|
|
60
|
-
) -> dict[str, Any]:
|
|
61
|
-
"""Format tool specification."""
|
|
62
|
-
tool_spec = {
|
|
63
|
-
"name": tool.name,
|
|
64
|
-
"parameters": convert(tool.parameters, custom_serializer=custom_serializer),
|
|
65
|
-
}
|
|
66
|
-
if tool.description:
|
|
67
|
-
tool_spec["description"] = tool.description
|
|
68
|
-
return {"type": "function", "function": tool_spec}
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
def _fix_invalid_arguments(value: Any) -> Any:
|
|
72
|
-
"""Attempt to repair incorrectly formatted json function arguments.
|
|
73
|
-
|
|
74
|
-
Small models (for example llama3.1 8B) may produce invalid argument values
|
|
75
|
-
which we attempt to repair here.
|
|
76
|
-
"""
|
|
77
|
-
if not isinstance(value, str):
|
|
78
|
-
return value
|
|
79
|
-
if (value.startswith("[") and value.endswith("]")) or (
|
|
80
|
-
value.startswith("{") and value.endswith("}")
|
|
81
|
-
):
|
|
82
|
-
try:
|
|
83
|
-
return json.loads(value)
|
|
84
|
-
except json.decoder.JSONDecodeError:
|
|
85
|
-
pass
|
|
86
|
-
return value
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
def _parse_tool_args(arguments: dict[str, Any]) -> dict[str, Any]:
|
|
90
|
-
"""Rewrite ollama tool arguments.
|
|
91
|
-
|
|
92
|
-
This function improves tool use quality by fixing common mistakes made by
|
|
93
|
-
small local tool use models. This will repair invalid json arguments and
|
|
94
|
-
omit unnecessary arguments with empty values that will fail intent parsing.
|
|
95
|
-
"""
|
|
96
|
-
return {k: _fix_invalid_arguments(v) for k, v in arguments.items() if v}
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
def _convert_content(
|
|
100
|
-
chat_content: (
|
|
101
|
-
conversation.Content
|
|
102
|
-
| conversation.ToolResultContent
|
|
103
|
-
| conversation.AssistantContent
|
|
104
|
-
),
|
|
105
|
-
) -> ollama.Message:
|
|
106
|
-
"""Create tool response content."""
|
|
107
|
-
if isinstance(chat_content, conversation.ToolResultContent):
|
|
108
|
-
return ollama.Message(
|
|
109
|
-
role=MessageRole.TOOL.value,
|
|
110
|
-
content=json.dumps(chat_content.tool_result),
|
|
111
|
-
)
|
|
112
|
-
if isinstance(chat_content, conversation.AssistantContent):
|
|
113
|
-
return ollama.Message(
|
|
114
|
-
role=MessageRole.ASSISTANT.value,
|
|
115
|
-
content=chat_content.content,
|
|
116
|
-
tool_calls=[
|
|
117
|
-
ollama.Message.ToolCall(
|
|
118
|
-
function=ollama.Message.ToolCall.Function(
|
|
119
|
-
name=tool_call.tool_name,
|
|
120
|
-
arguments=tool_call.tool_args,
|
|
121
|
-
)
|
|
122
|
-
)
|
|
123
|
-
for tool_call in chat_content.tool_calls or ()
|
|
124
|
-
],
|
|
125
|
-
)
|
|
126
|
-
if isinstance(chat_content, conversation.UserContent):
|
|
127
|
-
return ollama.Message(
|
|
128
|
-
role=MessageRole.USER.value,
|
|
129
|
-
content=chat_content.content,
|
|
130
|
-
)
|
|
131
|
-
if isinstance(chat_content, conversation.SystemContent):
|
|
132
|
-
return ollama.Message(
|
|
133
|
-
role=MessageRole.SYSTEM.value,
|
|
134
|
-
content=chat_content.content,
|
|
135
|
-
)
|
|
136
|
-
raise TypeError(f"Unexpected content type: {type(chat_content)}")
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
async def _transform_stream(
|
|
140
|
-
result: AsyncIterator[ollama.ChatResponse],
|
|
141
|
-
) -> AsyncGenerator[conversation.AssistantContentDeltaDict]:
|
|
142
|
-
"""Transform the response stream into HA format.
|
|
143
|
-
|
|
144
|
-
An Ollama streaming response may come in chunks like this:
|
|
145
|
-
|
|
146
|
-
response: message=Message(role="assistant", content="Paris")
|
|
147
|
-
response: message=Message(role="assistant", content=".")
|
|
148
|
-
response: message=Message(role="assistant", content=""), done: True, done_reason: "stop"
|
|
149
|
-
response: message=Message(role="assistant", tool_calls=[...])
|
|
150
|
-
response: message=Message(role="assistant", content=""), done: True, done_reason: "stop"
|
|
151
|
-
|
|
152
|
-
This generator conforms to the chatlog delta stream expectations in that it
|
|
153
|
-
yields deltas, then the role only once the response is done.
|
|
154
|
-
"""
|
|
155
|
-
|
|
156
|
-
new_msg = True
|
|
157
|
-
async for response in result:
|
|
158
|
-
_LOGGER.debug("Received response: %s", response)
|
|
159
|
-
response_message = response["message"]
|
|
160
|
-
chunk: conversation.AssistantContentDeltaDict = {}
|
|
161
|
-
if new_msg:
|
|
162
|
-
new_msg = False
|
|
163
|
-
chunk["role"] = "assistant"
|
|
164
|
-
if (tool_calls := response_message.get("tool_calls")) is not None:
|
|
165
|
-
chunk["tool_calls"] = [
|
|
166
|
-
llm.ToolInput(
|
|
167
|
-
tool_name=tool_call["function"]["name"],
|
|
168
|
-
tool_args=_parse_tool_args(tool_call["function"]["arguments"]),
|
|
169
|
-
)
|
|
170
|
-
for tool_call in tool_calls
|
|
171
|
-
]
|
|
172
|
-
if (content := response_message.get("content")) is not None:
|
|
173
|
-
chunk["content"] = content
|
|
174
|
-
if response_message.get("done"):
|
|
175
|
-
new_msg = True
|
|
176
|
-
yield chunk
|
|
177
|
-
|
|
178
|
-
|
|
179
35
|
class OllamaConversationEntity(
|
|
180
|
-
conversation.ConversationEntity,
|
|
36
|
+
conversation.ConversationEntity,
|
|
37
|
+
conversation.AbstractConversationAgent,
|
|
38
|
+
OllamaBaseLLMEntity,
|
|
181
39
|
):
|
|
182
40
|
"""Ollama conversation agent."""
|
|
183
41
|
|
|
@@ -185,17 +43,7 @@ class OllamaConversationEntity(
|
|
|
185
43
|
|
|
186
44
|
def __init__(self, entry: OllamaConfigEntry, subentry: ConfigSubentry) -> None:
|
|
187
45
|
"""Initialize the agent."""
|
|
188
|
-
|
|
189
|
-
self.subentry = subentry
|
|
190
|
-
self._attr_name = subentry.title
|
|
191
|
-
self._attr_unique_id = subentry.subentry_id
|
|
192
|
-
self._attr_device_info = dr.DeviceInfo(
|
|
193
|
-
identifiers={(DOMAIN, subentry.subentry_id)},
|
|
194
|
-
name=subentry.title,
|
|
195
|
-
manufacturer="Ollama",
|
|
196
|
-
model=entry.data[CONF_MODEL],
|
|
197
|
-
entry_type=dr.DeviceEntryType.SERVICE,
|
|
198
|
-
)
|
|
46
|
+
super().__init__(entry, subentry)
|
|
199
47
|
if self.subentry.data.get(CONF_LLM_HASS_API):
|
|
200
48
|
self._attr_supported_features = (
|
|
201
49
|
conversation.ConversationEntityFeature.CONTROL
|
|
@@ -255,89 +103,6 @@ class OllamaConversationEntity(
|
|
|
255
103
|
continue_conversation=chat_log.continue_conversation,
|
|
256
104
|
)
|
|
257
105
|
|
|
258
|
-
async def _async_handle_chat_log(
|
|
259
|
-
self,
|
|
260
|
-
chat_log: conversation.ChatLog,
|
|
261
|
-
) -> None:
|
|
262
|
-
"""Generate an answer for the chat log."""
|
|
263
|
-
settings = {**self.entry.data, **self.subentry.data}
|
|
264
|
-
|
|
265
|
-
client = self.entry.runtime_data
|
|
266
|
-
model = settings[CONF_MODEL]
|
|
267
|
-
|
|
268
|
-
tools: list[dict[str, Any]] | None = None
|
|
269
|
-
if chat_log.llm_api:
|
|
270
|
-
tools = [
|
|
271
|
-
_format_tool(tool, chat_log.llm_api.custom_serializer)
|
|
272
|
-
for tool in chat_log.llm_api.tools
|
|
273
|
-
]
|
|
274
|
-
|
|
275
|
-
message_history: MessageHistory = MessageHistory(
|
|
276
|
-
[_convert_content(content) for content in chat_log.content]
|
|
277
|
-
)
|
|
278
|
-
max_messages = int(settings.get(CONF_MAX_HISTORY, DEFAULT_MAX_HISTORY))
|
|
279
|
-
self._trim_history(message_history, max_messages)
|
|
280
|
-
|
|
281
|
-
# Get response
|
|
282
|
-
# To prevent infinite loops, we limit the number of iterations
|
|
283
|
-
for _iteration in range(MAX_TOOL_ITERATIONS):
|
|
284
|
-
try:
|
|
285
|
-
response_generator = await client.chat(
|
|
286
|
-
model=model,
|
|
287
|
-
# Make a copy of the messages because we mutate the list later
|
|
288
|
-
messages=list(message_history.messages),
|
|
289
|
-
tools=tools,
|
|
290
|
-
stream=True,
|
|
291
|
-
# keep_alive requires specifying unit. In this case, seconds
|
|
292
|
-
keep_alive=f"{settings.get(CONF_KEEP_ALIVE, DEFAULT_KEEP_ALIVE)}s",
|
|
293
|
-
options={CONF_NUM_CTX: settings.get(CONF_NUM_CTX, DEFAULT_NUM_CTX)},
|
|
294
|
-
think=settings.get(CONF_THINK),
|
|
295
|
-
)
|
|
296
|
-
except (ollama.RequestError, ollama.ResponseError) as err:
|
|
297
|
-
_LOGGER.error("Unexpected error talking to Ollama server: %s", err)
|
|
298
|
-
raise HomeAssistantError(
|
|
299
|
-
f"Sorry, I had a problem talking to the Ollama server: {err}"
|
|
300
|
-
) from err
|
|
301
|
-
|
|
302
|
-
message_history.messages.extend(
|
|
303
|
-
[
|
|
304
|
-
_convert_content(content)
|
|
305
|
-
async for content in chat_log.async_add_delta_content_stream(
|
|
306
|
-
self.entity_id, _transform_stream(response_generator)
|
|
307
|
-
)
|
|
308
|
-
]
|
|
309
|
-
)
|
|
310
|
-
|
|
311
|
-
if not chat_log.unresponded_tool_results:
|
|
312
|
-
break
|
|
313
|
-
|
|
314
|
-
def _trim_history(self, message_history: MessageHistory, max_messages: int) -> None:
|
|
315
|
-
"""Trims excess messages from a single history.
|
|
316
|
-
|
|
317
|
-
This sets the max history to allow a configurable size history may take
|
|
318
|
-
up in the context window.
|
|
319
|
-
|
|
320
|
-
Note that some messages in the history may not be from ollama only, and
|
|
321
|
-
may come from other anents, so the assumptions here may not strictly hold,
|
|
322
|
-
but generally should be effective.
|
|
323
|
-
"""
|
|
324
|
-
if max_messages < 1:
|
|
325
|
-
# Keep all messages
|
|
326
|
-
return
|
|
327
|
-
|
|
328
|
-
# Ignore the in progress user message
|
|
329
|
-
num_previous_rounds = message_history.num_user_messages - 1
|
|
330
|
-
if num_previous_rounds >= max_messages:
|
|
331
|
-
# Trim history but keep system prompt (first message).
|
|
332
|
-
# Every other message should be an assistant message, so keep 2x
|
|
333
|
-
# message objects. Also keep the last in progress user message
|
|
334
|
-
num_keep = 2 * max_messages + 1
|
|
335
|
-
drop_index = len(message_history.messages) - num_keep
|
|
336
|
-
message_history.messages = [
|
|
337
|
-
message_history.messages[0],
|
|
338
|
-
*message_history.messages[drop_index:],
|
|
339
|
-
]
|
|
340
|
-
|
|
341
106
|
async def _async_entry_update_listener(
|
|
342
107
|
self, hass: HomeAssistant, entry: ConfigEntry
|
|
343
108
|
) -> None:
|
|
@@ -0,0 +1,261 @@
|
|
|
1
|
+
"""Base entity for the Ollama integration."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from collections.abc import AsyncGenerator, AsyncIterator, Callable
|
|
6
|
+
import json
|
|
7
|
+
import logging
|
|
8
|
+
from typing import Any
|
|
9
|
+
|
|
10
|
+
import ollama
|
|
11
|
+
from voluptuous_openapi import convert
|
|
12
|
+
|
|
13
|
+
from homeassistant.components import conversation
|
|
14
|
+
from homeassistant.config_entries import ConfigSubentry
|
|
15
|
+
from homeassistant.exceptions import HomeAssistantError
|
|
16
|
+
from homeassistant.helpers import device_registry as dr, llm
|
|
17
|
+
from homeassistant.helpers.entity import Entity
|
|
18
|
+
|
|
19
|
+
from . import OllamaConfigEntry
|
|
20
|
+
from .const import (
|
|
21
|
+
CONF_KEEP_ALIVE,
|
|
22
|
+
CONF_MAX_HISTORY,
|
|
23
|
+
CONF_MODEL,
|
|
24
|
+
CONF_NUM_CTX,
|
|
25
|
+
CONF_THINK,
|
|
26
|
+
DEFAULT_KEEP_ALIVE,
|
|
27
|
+
DEFAULT_MAX_HISTORY,
|
|
28
|
+
DEFAULT_NUM_CTX,
|
|
29
|
+
DOMAIN,
|
|
30
|
+
)
|
|
31
|
+
from .models import MessageHistory, MessageRole
|
|
32
|
+
|
|
33
|
+
# Max number of back and forth with the LLM to generate a response
|
|
34
|
+
MAX_TOOL_ITERATIONS = 10
|
|
35
|
+
|
|
36
|
+
_LOGGER = logging.getLogger(__name__)
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
def _format_tool(
|
|
40
|
+
tool: llm.Tool, custom_serializer: Callable[[Any], Any] | None
|
|
41
|
+
) -> dict[str, Any]:
|
|
42
|
+
"""Format tool specification."""
|
|
43
|
+
tool_spec = {
|
|
44
|
+
"name": tool.name,
|
|
45
|
+
"parameters": convert(tool.parameters, custom_serializer=custom_serializer),
|
|
46
|
+
}
|
|
47
|
+
if tool.description:
|
|
48
|
+
tool_spec["description"] = tool.description
|
|
49
|
+
return {"type": "function", "function": tool_spec}
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
def _fix_invalid_arguments(value: Any) -> Any:
|
|
53
|
+
"""Attempt to repair incorrectly formatted json function arguments.
|
|
54
|
+
|
|
55
|
+
Small models (for example llama3.1 8B) may produce invalid argument values
|
|
56
|
+
which we attempt to repair here.
|
|
57
|
+
"""
|
|
58
|
+
if not isinstance(value, str):
|
|
59
|
+
return value
|
|
60
|
+
if (value.startswith("[") and value.endswith("]")) or (
|
|
61
|
+
value.startswith("{") and value.endswith("}")
|
|
62
|
+
):
|
|
63
|
+
try:
|
|
64
|
+
return json.loads(value)
|
|
65
|
+
except json.decoder.JSONDecodeError:
|
|
66
|
+
pass
|
|
67
|
+
return value
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
def _parse_tool_args(arguments: dict[str, Any]) -> dict[str, Any]:
|
|
71
|
+
"""Rewrite ollama tool arguments.
|
|
72
|
+
|
|
73
|
+
This function improves tool use quality by fixing common mistakes made by
|
|
74
|
+
small local tool use models. This will repair invalid json arguments and
|
|
75
|
+
omit unnecessary arguments with empty values that will fail intent parsing.
|
|
76
|
+
"""
|
|
77
|
+
return {k: _fix_invalid_arguments(v) for k, v in arguments.items() if v}
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
def _convert_content(
|
|
81
|
+
chat_content: (
|
|
82
|
+
conversation.Content
|
|
83
|
+
| conversation.ToolResultContent
|
|
84
|
+
| conversation.AssistantContent
|
|
85
|
+
),
|
|
86
|
+
) -> ollama.Message:
|
|
87
|
+
"""Create tool response content."""
|
|
88
|
+
if isinstance(chat_content, conversation.ToolResultContent):
|
|
89
|
+
return ollama.Message(
|
|
90
|
+
role=MessageRole.TOOL.value,
|
|
91
|
+
content=json.dumps(chat_content.tool_result),
|
|
92
|
+
)
|
|
93
|
+
if isinstance(chat_content, conversation.AssistantContent):
|
|
94
|
+
return ollama.Message(
|
|
95
|
+
role=MessageRole.ASSISTANT.value,
|
|
96
|
+
content=chat_content.content,
|
|
97
|
+
tool_calls=[
|
|
98
|
+
ollama.Message.ToolCall(
|
|
99
|
+
function=ollama.Message.ToolCall.Function(
|
|
100
|
+
name=tool_call.tool_name,
|
|
101
|
+
arguments=tool_call.tool_args,
|
|
102
|
+
)
|
|
103
|
+
)
|
|
104
|
+
for tool_call in chat_content.tool_calls or ()
|
|
105
|
+
],
|
|
106
|
+
)
|
|
107
|
+
if isinstance(chat_content, conversation.UserContent):
|
|
108
|
+
return ollama.Message(
|
|
109
|
+
role=MessageRole.USER.value,
|
|
110
|
+
content=chat_content.content,
|
|
111
|
+
)
|
|
112
|
+
if isinstance(chat_content, conversation.SystemContent):
|
|
113
|
+
return ollama.Message(
|
|
114
|
+
role=MessageRole.SYSTEM.value,
|
|
115
|
+
content=chat_content.content,
|
|
116
|
+
)
|
|
117
|
+
raise TypeError(f"Unexpected content type: {type(chat_content)}")
|
|
118
|
+
|
|
119
|
+
|
|
120
|
+
async def _transform_stream(
|
|
121
|
+
result: AsyncIterator[ollama.ChatResponse],
|
|
122
|
+
) -> AsyncGenerator[conversation.AssistantContentDeltaDict]:
|
|
123
|
+
"""Transform the response stream into HA format.
|
|
124
|
+
|
|
125
|
+
An Ollama streaming response may come in chunks like this:
|
|
126
|
+
|
|
127
|
+
response: message=Message(role="assistant", content="Paris")
|
|
128
|
+
response: message=Message(role="assistant", content=".")
|
|
129
|
+
response: message=Message(role="assistant", content=""), done: True, done_reason: "stop"
|
|
130
|
+
response: message=Message(role="assistant", tool_calls=[...])
|
|
131
|
+
response: message=Message(role="assistant", content=""), done: True, done_reason: "stop"
|
|
132
|
+
|
|
133
|
+
This generator conforms to the chatlog delta stream expectations in that it
|
|
134
|
+
yields deltas, then the role only once the response is done.
|
|
135
|
+
"""
|
|
136
|
+
|
|
137
|
+
new_msg = True
|
|
138
|
+
async for response in result:
|
|
139
|
+
_LOGGER.debug("Received response: %s", response)
|
|
140
|
+
response_message = response["message"]
|
|
141
|
+
chunk: conversation.AssistantContentDeltaDict = {}
|
|
142
|
+
if new_msg:
|
|
143
|
+
new_msg = False
|
|
144
|
+
chunk["role"] = "assistant"
|
|
145
|
+
if (tool_calls := response_message.get("tool_calls")) is not None:
|
|
146
|
+
chunk["tool_calls"] = [
|
|
147
|
+
llm.ToolInput(
|
|
148
|
+
tool_name=tool_call["function"]["name"],
|
|
149
|
+
tool_args=_parse_tool_args(tool_call["function"]["arguments"]),
|
|
150
|
+
)
|
|
151
|
+
for tool_call in tool_calls
|
|
152
|
+
]
|
|
153
|
+
if (content := response_message.get("content")) is not None:
|
|
154
|
+
chunk["content"] = content
|
|
155
|
+
if response_message.get("done"):
|
|
156
|
+
new_msg = True
|
|
157
|
+
yield chunk
|
|
158
|
+
|
|
159
|
+
|
|
160
|
+
class OllamaBaseLLMEntity(Entity):
|
|
161
|
+
"""Ollama base LLM entity."""
|
|
162
|
+
|
|
163
|
+
def __init__(self, entry: OllamaConfigEntry, subentry: ConfigSubentry) -> None:
|
|
164
|
+
"""Initialize the entity."""
|
|
165
|
+
self.entry = entry
|
|
166
|
+
self.subentry = subentry
|
|
167
|
+
self._attr_name = subentry.title
|
|
168
|
+
self._attr_unique_id = subentry.subentry_id
|
|
169
|
+
|
|
170
|
+
model, _, version = subentry.data[CONF_MODEL].partition(":")
|
|
171
|
+
self._attr_device_info = dr.DeviceInfo(
|
|
172
|
+
identifiers={(DOMAIN, subentry.subentry_id)},
|
|
173
|
+
name=subentry.title,
|
|
174
|
+
manufacturer="Ollama",
|
|
175
|
+
model=model,
|
|
176
|
+
sw_version=version or "latest",
|
|
177
|
+
entry_type=dr.DeviceEntryType.SERVICE,
|
|
178
|
+
)
|
|
179
|
+
|
|
180
|
+
async def _async_handle_chat_log(
|
|
181
|
+
self,
|
|
182
|
+
chat_log: conversation.ChatLog,
|
|
183
|
+
) -> None:
|
|
184
|
+
"""Generate an answer for the chat log."""
|
|
185
|
+
settings = {**self.entry.data, **self.subentry.data}
|
|
186
|
+
|
|
187
|
+
client = self.entry.runtime_data
|
|
188
|
+
model = settings[CONF_MODEL]
|
|
189
|
+
|
|
190
|
+
tools: list[dict[str, Any]] | None = None
|
|
191
|
+
if chat_log.llm_api:
|
|
192
|
+
tools = [
|
|
193
|
+
_format_tool(tool, chat_log.llm_api.custom_serializer)
|
|
194
|
+
for tool in chat_log.llm_api.tools
|
|
195
|
+
]
|
|
196
|
+
|
|
197
|
+
message_history: MessageHistory = MessageHistory(
|
|
198
|
+
[_convert_content(content) for content in chat_log.content]
|
|
199
|
+
)
|
|
200
|
+
max_messages = int(settings.get(CONF_MAX_HISTORY, DEFAULT_MAX_HISTORY))
|
|
201
|
+
self._trim_history(message_history, max_messages)
|
|
202
|
+
|
|
203
|
+
# Get response
|
|
204
|
+
# To prevent infinite loops, we limit the number of iterations
|
|
205
|
+
for _iteration in range(MAX_TOOL_ITERATIONS):
|
|
206
|
+
try:
|
|
207
|
+
response_generator = await client.chat(
|
|
208
|
+
model=model,
|
|
209
|
+
# Make a copy of the messages because we mutate the list later
|
|
210
|
+
messages=list(message_history.messages),
|
|
211
|
+
tools=tools,
|
|
212
|
+
stream=True,
|
|
213
|
+
# keep_alive requires specifying unit. In this case, seconds
|
|
214
|
+
keep_alive=f"{settings.get(CONF_KEEP_ALIVE, DEFAULT_KEEP_ALIVE)}s",
|
|
215
|
+
options={CONF_NUM_CTX: settings.get(CONF_NUM_CTX, DEFAULT_NUM_CTX)},
|
|
216
|
+
think=settings.get(CONF_THINK),
|
|
217
|
+
)
|
|
218
|
+
except (ollama.RequestError, ollama.ResponseError) as err:
|
|
219
|
+
_LOGGER.error("Unexpected error talking to Ollama server: %s", err)
|
|
220
|
+
raise HomeAssistantError(
|
|
221
|
+
f"Sorry, I had a problem talking to the Ollama server: {err}"
|
|
222
|
+
) from err
|
|
223
|
+
|
|
224
|
+
message_history.messages.extend(
|
|
225
|
+
[
|
|
226
|
+
_convert_content(content)
|
|
227
|
+
async for content in chat_log.async_add_delta_content_stream(
|
|
228
|
+
self.entity_id, _transform_stream(response_generator)
|
|
229
|
+
)
|
|
230
|
+
]
|
|
231
|
+
)
|
|
232
|
+
|
|
233
|
+
if not chat_log.unresponded_tool_results:
|
|
234
|
+
break
|
|
235
|
+
|
|
236
|
+
def _trim_history(self, message_history: MessageHistory, max_messages: int) -> None:
|
|
237
|
+
"""Trims excess messages from a single history.
|
|
238
|
+
|
|
239
|
+
This sets the max history to allow a configurable size history may take
|
|
240
|
+
up in the context window.
|
|
241
|
+
|
|
242
|
+
Note that some messages in the history may not be from ollama only, and
|
|
243
|
+
may come from other anents, so the assumptions here may not strictly hold,
|
|
244
|
+
but generally should be effective.
|
|
245
|
+
"""
|
|
246
|
+
if max_messages < 1:
|
|
247
|
+
# Keep all messages
|
|
248
|
+
return
|
|
249
|
+
|
|
250
|
+
# Ignore the in progress user message
|
|
251
|
+
num_previous_rounds = message_history.num_user_messages - 1
|
|
252
|
+
if num_previous_rounds >= max_messages:
|
|
253
|
+
# Trim history but keep system prompt (first message).
|
|
254
|
+
# Every other message should be an assistant message, so keep 2x
|
|
255
|
+
# message objects. Also keep the last in progress user message
|
|
256
|
+
num_keep = 2 * max_messages + 1
|
|
257
|
+
drop_index = len(message_history.messages) - num_keep
|
|
258
|
+
message_history.messages = [
|
|
259
|
+
message_history.messages[0],
|
|
260
|
+
*message_history.messages[drop_index:],
|
|
261
|
+
]
|
|
@@ -3,24 +3,17 @@
|
|
|
3
3
|
"step": {
|
|
4
4
|
"user": {
|
|
5
5
|
"data": {
|
|
6
|
-
"url": "[%key:common::config_flow::data::url%]"
|
|
7
|
-
"model": "Model"
|
|
6
|
+
"url": "[%key:common::config_flow::data::url%]"
|
|
8
7
|
}
|
|
9
|
-
},
|
|
10
|
-
"download": {
|
|
11
|
-
"title": "Downloading model"
|
|
12
8
|
}
|
|
13
9
|
},
|
|
14
10
|
"abort": {
|
|
15
|
-
"download_failed": "Model downloading failed",
|
|
16
11
|
"already_configured": "[%key:common::config_flow::abort::already_configured_service%]"
|
|
17
12
|
},
|
|
18
13
|
"error": {
|
|
14
|
+
"invalid_url": "[%key:common::config_flow::error::invalid_host%]",
|
|
19
15
|
"cannot_connect": "[%key:common::config_flow::error::cannot_connect%]",
|
|
20
16
|
"unknown": "[%key:common::config_flow::error::unknown%]"
|
|
21
|
-
},
|
|
22
|
-
"progress": {
|
|
23
|
-
"download": "Please wait while the model is downloaded, which may take a very long time. Check your Ollama server logs for more details."
|
|
24
17
|
}
|
|
25
18
|
},
|
|
26
19
|
"config_subentries": {
|
|
@@ -33,6 +26,7 @@
|
|
|
33
26
|
"step": {
|
|
34
27
|
"set_options": {
|
|
35
28
|
"data": {
|
|
29
|
+
"model": "Model",
|
|
36
30
|
"name": "[%key:common::config_flow::data::name%]",
|
|
37
31
|
"prompt": "Instructions",
|
|
38
32
|
"llm_hass_api": "[%key:common::config_flow::data::llm_hass_api%]",
|
|
@@ -47,11 +41,19 @@
|
|
|
47
41
|
"num_ctx": "Maximum number of text tokens the model can process. Lower to reduce Ollama RAM, or increase for a large number of exposed entities.",
|
|
48
42
|
"think": "If enabled, the LLM will think before responding. This can improve response quality but may increase latency."
|
|
49
43
|
}
|
|
44
|
+
},
|
|
45
|
+
"download": {
|
|
46
|
+
"title": "Downloading model"
|
|
50
47
|
}
|
|
51
48
|
},
|
|
52
49
|
"abort": {
|
|
53
50
|
"reconfigure_successful": "[%key:common::config_flow::abort::reconfigure_successful%]",
|
|
54
|
-
"entry_not_loaded": "
|
|
51
|
+
"entry_not_loaded": "Failed to add agent. The configuration is disabled.",
|
|
52
|
+
"download_failed": "Model downloading failed",
|
|
53
|
+
"cannot_connect": "[%key:common::config_flow::error::cannot_connect%]"
|
|
54
|
+
},
|
|
55
|
+
"progress": {
|
|
56
|
+
"download": "Please wait while the model is downloaded, which may take a very long time. Check your Ollama server logs for more details."
|
|
55
57
|
}
|
|
56
58
|
}
|
|
57
59
|
}
|
|
@@ -5,12 +5,12 @@
|
|
|
5
5
|
},
|
|
6
6
|
"error": {
|
|
7
7
|
"cannot_connect": "\u041d\u0435\u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0441\u0432\u044a\u0440\u0437\u0432\u0430\u043d\u0435",
|
|
8
|
+
"invalid_url": "\u041d\u0435\u0432\u0430\u043b\u0438\u0434\u043d\u043e \u0438\u043c\u0435 \u043d\u0430 \u0445\u043e\u0441\u0442 \u0438\u043b\u0438 IP \u0430\u0434\u0440\u0435\u0441",
|
|
8
9
|
"unknown": "\u041d\u0435\u043e\u0447\u0430\u043a\u0432\u0430\u043d\u0430 \u0433\u0440\u0435\u0448\u043a\u0430"
|
|
9
10
|
},
|
|
10
11
|
"step": {
|
|
11
12
|
"user": {
|
|
12
13
|
"data": {
|
|
13
|
-
"model": "\u041c\u043e\u0434\u0435\u043b",
|
|
14
14
|
"url": "URL"
|
|
15
15
|
}
|
|
16
16
|
}
|
|
@@ -19,12 +19,14 @@
|
|
|
19
19
|
"config_subentries": {
|
|
20
20
|
"conversation": {
|
|
21
21
|
"abort": {
|
|
22
|
+
"cannot_connect": "\u041d\u0435\u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0441\u0432\u044a\u0440\u0437\u0432\u0430\u043d\u0435",
|
|
22
23
|
"reconfigure_successful": "\u041f\u0440\u0435\u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0438\u0440\u0430\u043d\u0435\u0442\u043e \u0431\u0435\u0448\u0435 \u0443\u0441\u043f\u0435\u0448\u043d\u043e"
|
|
23
24
|
},
|
|
24
25
|
"step": {
|
|
25
26
|
"set_options": {
|
|
26
27
|
"data": {
|
|
27
28
|
"llm_hass_api": "\u0423\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043d\u0430 Home Assistant",
|
|
29
|
+
"model": "\u041c\u043e\u0434\u0435\u043b",
|
|
28
30
|
"name": "\u0418\u043c\u0435",
|
|
29
31
|
"prompt": "\u0418\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438"
|
|
30
32
|
}
|
|
@@ -1,22 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"config": {
|
|
3
|
-
"abort": {
|
|
4
|
-
"download_failed": "Ha fallat la baixada del model"
|
|
5
|
-
},
|
|
6
3
|
"error": {
|
|
7
4
|
"cannot_connect": "Ha fallat la connexi\u00f3",
|
|
8
5
|
"unknown": "Error inesperat"
|
|
9
6
|
},
|
|
10
|
-
"progress": {
|
|
11
|
-
"download": "Espera mentre es baixa el model, aix\u00f2 pot trigar molt temps. Consulta els registres del teu servidor Ollama per a m\u00e9s detalls."
|
|
12
|
-
},
|
|
13
7
|
"step": {
|
|
14
|
-
"download": {
|
|
15
|
-
"title": "Baixant model"
|
|
16
|
-
},
|
|
17
8
|
"user": {
|
|
18
9
|
"data": {
|
|
19
|
-
"model": "Model",
|
|
20
10
|
"url": "URL"
|
|
21
11
|
}
|
|
22
12
|
}
|