homeassistant 2025.7.0b0__py3-none-any.whl → 2025.7.0b1__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/aemet/sensor.py +1 -1
- homeassistant/components/airq/coordinator.py +2 -2
- homeassistant/components/alexa_devices/__init__.py +5 -2
- homeassistant/components/alexa_devices/notify.py +2 -0
- homeassistant/components/alexa_devices/quality_scale.yaml +1 -1
- homeassistant/components/alexa_devices/strings.json +11 -4
- homeassistant/components/alexa_devices/switch.py +2 -0
- homeassistant/components/alexa_devices/translations/bg.json +6 -4
- homeassistant/components/alexa_devices/translations/cs.json +0 -4
- homeassistant/components/alexa_devices/translations/de.json +6 -7
- homeassistant/components/alexa_devices/translations/el.json +4 -5
- homeassistant/components/alexa_devices/translations/en.json +12 -5
- homeassistant/components/alexa_devices/translations/es.json +0 -4
- homeassistant/components/alexa_devices/translations/et.json +4 -5
- homeassistant/components/alexa_devices/translations/ga.json +0 -6
- homeassistant/components/alexa_devices/translations/he.json +0 -4
- homeassistant/components/alexa_devices/translations/hu.json +0 -4
- homeassistant/components/alexa_devices/translations/id.json +1 -0
- homeassistant/components/alexa_devices/translations/lt.json +0 -4
- homeassistant/components/alexa_devices/translations/mk.json +12 -0
- homeassistant/components/alexa_devices/translations/nl.json +0 -4
- homeassistant/components/alexa_devices/translations/pl.json +0 -4
- homeassistant/components/alexa_devices/translations/pt.json +0 -4
- homeassistant/components/alexa_devices/translations/ru.json +4 -5
- homeassistant/components/alexa_devices/translations/sk.json +4 -5
- homeassistant/components/alexa_devices/translations/sv.json +17 -5
- homeassistant/components/alexa_devices/translations/tr.json +0 -4
- homeassistant/components/alexa_devices/translations/zh-Hans.json +15 -4
- homeassistant/components/alexa_devices/translations/zh-Hant.json +4 -5
- homeassistant/components/alexa_devices/utils.py +40 -0
- homeassistant/components/altruist/translations/id.json +11 -0
- homeassistant/components/anthropic/__init__.py +8 -1
- homeassistant/components/anthropic/translations/bg.json +21 -0
- homeassistant/components/anthropic/translations/ga.json +32 -1
- homeassistant/components/anthropic/translations/id.json +19 -0
- homeassistant/components/anthropic/translations/ru.json +30 -0
- homeassistant/components/buienradar/sensor.py +0 -1
- homeassistant/components/cambridge_audio/translations/sv.json +1 -1
- homeassistant/components/demo/translations/select.sv.json +2 -2
- homeassistant/components/derivative/translations/ga.json +20 -0
- homeassistant/components/derivative/translations/ru.json +3 -0
- homeassistant/components/devolo_home_control/translations/bg.json +6 -0
- homeassistant/components/devolo_home_control/translations/id.json +5 -0
- homeassistant/components/devolo_home_control/translations/sv.json +10 -0
- homeassistant/components/devolo_home_control/translations/zh-Hans.json +10 -0
- homeassistant/components/dlink/manifest.json +1 -1
- homeassistant/components/ecovacs/translations/sv.json +1 -1
- homeassistant/components/enphase_envoy/translations/sv.json +2 -2
- homeassistant/components/ezviz/translations/bg.json +6 -0
- homeassistant/components/ezviz/translations/mk.json +13 -0
- homeassistant/components/ezviz/translations/sv.json +10 -0
- homeassistant/components/ezviz/translations/zh-Hans.json +10 -0
- homeassistant/components/frontend/manifest.json +1 -1
- homeassistant/components/goodwe/translations/sv.json +5 -5
- homeassistant/components/google_generative_ai_conversation/__init__.py +15 -0
- homeassistant/components/google_generative_ai_conversation/config_flow.py +72 -36
- homeassistant/components/google_generative_ai_conversation/const.py +15 -2
- homeassistant/components/google_generative_ai_conversation/diagnostics.py +1 -0
- homeassistant/components/google_generative_ai_conversation/entity.py +7 -2
- homeassistant/components/google_generative_ai_conversation/helpers.py +73 -0
- homeassistant/components/google_generative_ai_conversation/strings.json +28 -1
- homeassistant/components/google_generative_ai_conversation/translations/bg.json +19 -0
- homeassistant/components/google_generative_ai_conversation/translations/de.json +28 -0
- homeassistant/components/google_generative_ai_conversation/translations/el.json +28 -0
- homeassistant/components/google_generative_ai_conversation/translations/en.json +28 -0
- homeassistant/components/google_generative_ai_conversation/translations/es.json +28 -0
- homeassistant/components/google_generative_ai_conversation/translations/et.json +28 -0
- homeassistant/components/google_generative_ai_conversation/translations/ga.json +9 -0
- homeassistant/components/google_generative_ai_conversation/translations/id.json +30 -0
- homeassistant/components/google_generative_ai_conversation/translations/mk.json +11 -0
- homeassistant/components/google_generative_ai_conversation/translations/ru.json +67 -0
- homeassistant/components/google_generative_ai_conversation/translations/sk.json +28 -0
- homeassistant/components/google_generative_ai_conversation/translations/sv.json +21 -0
- homeassistant/components/google_generative_ai_conversation/translations/zh-Hans.json +28 -0
- homeassistant/components/google_generative_ai_conversation/translations/zh-Hant.json +28 -0
- homeassistant/components/google_generative_ai_conversation/tts.py +48 -106
- homeassistant/components/group/translations/el.json +18 -18
- homeassistant/components/habitica/const.py +1 -1
- homeassistant/components/harmony/translations/select.sv.json +1 -1
- homeassistant/components/harmony/translations/sv.json +1 -1
- homeassistant/components/homeassistant_hardware/translations/ga.json +9 -0
- homeassistant/components/homeassistant_hardware/translations/mk.json +9 -0
- homeassistant/components/homeassistant_sky_connect/translations/ga.json +10 -0
- homeassistant/components/homeassistant_sky_connect/translations/mk.json +7 -0
- homeassistant/components/homeassistant_yellow/translations/ga.json +5 -0
- homeassistant/components/homewizard/translations/sv.json +3 -1
- homeassistant/components/http/auth.py +1 -1
- homeassistant/components/image/__init__.py +34 -3
- homeassistant/components/input_select/translations/sv.json +6 -6
- homeassistant/components/iron_os/translations/sv.json +1 -1
- homeassistant/components/keenetic_ndms2/translations/id.json +3 -0
- homeassistant/components/lamarzocco/translations/sv.json +3 -3
- homeassistant/components/lametric/translations/sv.json +2 -2
- homeassistant/components/lametric/update.py +1 -1
- homeassistant/components/lg_thinq/translations/sv.json +5 -5
- homeassistant/components/litterrobot/translations/bg.json +4 -0
- homeassistant/components/litterrobot/translations/ga.json +3 -0
- homeassistant/components/matter/translations/id.json +5 -0
- homeassistant/components/matter/vacuum.py +38 -26
- homeassistant/components/meater/__init__.py +5 -1
- homeassistant/components/meater/coordinator.py +4 -2
- homeassistant/components/media_source/local_source.py +21 -4
- homeassistant/components/mqtt/translations/bg.json +10 -0
- homeassistant/components/mqtt/translations/el.json +21 -0
- homeassistant/components/mqtt/translations/fi.json +3 -0
- homeassistant/components/mqtt/translations/ga.json +25 -0
- homeassistant/components/mqtt/translations/mk.json +23 -0
- homeassistant/components/mqtt/translations/ru.json +1 -0
- homeassistant/components/mqtt/translations/sv.json +24 -0
- homeassistant/components/mqtt/translations/zh-Hans.json +26 -0
- homeassistant/components/mqtt/translations/zh-Hant.json +19 -0
- homeassistant/components/music_assistant/button.py +0 -6
- homeassistant/components/ntfy/translations/id.json +13 -0
- homeassistant/components/ohme/translations/sv.json +1 -1
- homeassistant/components/ollama/__init__.py +2 -0
- homeassistant/components/ollama/const.py +2 -0
- homeassistant/components/ollama/translations/bg.json +19 -0
- homeassistant/components/ollama/translations/ga.json +31 -1
- homeassistant/components/ollama/translations/id.json +18 -0
- homeassistant/components/ollama/translations/mk.json +13 -1
- homeassistant/components/onewire/translations/sv.json +4 -4
- homeassistant/components/openai_conversation/__init__.py +2 -0
- homeassistant/components/openai_conversation/const.py +1 -1
- homeassistant/components/openai_conversation/conversation.py +1 -1
- homeassistant/components/openai_conversation/translations/bg.json +26 -0
- homeassistant/components/openai_conversation/translations/id.json +23 -0
- homeassistant/components/openai_conversation/translations/mk.json +44 -0
- homeassistant/components/playstation_network/translations/bg.json +25 -1
- homeassistant/components/playstation_network/translations/es.json +1 -1
- homeassistant/components/playstation_network/translations/ga.json +31 -0
- homeassistant/components/playstation_network/translations/id.json +14 -0
- homeassistant/components/playstation_network/translations/mk.json +18 -0
- homeassistant/components/playstation_network/translations/sv.json +29 -0
- homeassistant/components/playstation_network/translations/zh-Hans.json +29 -0
- homeassistant/components/qnap/translations/sv.json +1 -1
- homeassistant/components/remote_calendar/translations/fi.json +34 -0
- homeassistant/components/select/translations/sv.json +10 -10
- homeassistant/components/smarla/__init__.py +2 -2
- homeassistant/components/sonos/translations/bg.json +5 -0
- homeassistant/components/sonos/translations/el.json +6 -0
- homeassistant/components/sonos/translations/ga.json +8 -0
- homeassistant/components/sonos/translations/mk.json +10 -0
- homeassistant/components/sonos/translations/ru.json +6 -0
- homeassistant/components/sonos/translations/sv.json +6 -0
- homeassistant/components/sonos/translations/zh-Hans.json +9 -0
- homeassistant/components/sonos/translations/zh-Hant.json +6 -0
- homeassistant/components/switchbot/translations/bg.json +26 -0
- homeassistant/components/switchbot/translations/ga.json +33 -0
- homeassistant/components/switchbot/translations/id.json +19 -0
- homeassistant/components/switchbot/translations/mk.json +49 -0
- homeassistant/components/switchbot/translations/sv.json +52 -0
- homeassistant/components/switchbot/translations/zh-Hans.json +53 -0
- homeassistant/components/telegram_bot/__init__.py +20 -4
- homeassistant/components/telegram_bot/bot.py +33 -29
- homeassistant/components/telegram_bot/config_flow.py +49 -10
- homeassistant/components/telegram_bot/const.py +1 -1
- homeassistant/components/telegram_bot/strings.json +33 -10
- homeassistant/components/telegram_bot/translations/bg.json +0 -1
- homeassistant/components/telegram_bot/translations/cs.json +5 -12
- homeassistant/components/telegram_bot/translations/de.json +12 -11
- homeassistant/components/telegram_bot/translations/el.json +5 -12
- homeassistant/components/telegram_bot/translations/en-GB.json +5 -12
- homeassistant/components/telegram_bot/translations/en.json +35 -12
- homeassistant/components/telegram_bot/translations/es.json +5 -12
- homeassistant/components/telegram_bot/translations/et.json +11 -12
- homeassistant/components/telegram_bot/translations/fr.json +5 -12
- homeassistant/components/telegram_bot/translations/ga.json +5 -11
- homeassistant/components/telegram_bot/translations/he.json +3 -8
- homeassistant/components/telegram_bot/translations/hu.json +5 -12
- homeassistant/components/telegram_bot/translations/id.json +0 -5
- homeassistant/components/telegram_bot/translations/it.json +2 -5
- homeassistant/components/telegram_bot/translations/lt.json +5 -12
- homeassistant/components/telegram_bot/translations/mk.json +7 -5
- homeassistant/components/telegram_bot/translations/nl.json +5 -12
- homeassistant/components/telegram_bot/translations/pt.json +5 -12
- homeassistant/components/telegram_bot/translations/ru.json +12 -11
- homeassistant/components/telegram_bot/translations/sk.json +5 -12
- homeassistant/components/telegram_bot/translations/sv.json +5 -12
- homeassistant/components/telegram_bot/translations/tr.json +5 -12
- homeassistant/components/telegram_bot/translations/zh-Hans.json +5 -12
- homeassistant/components/telegram_bot/translations/zh-Hant.json +5 -12
- homeassistant/components/template/translations/sv.json +5 -5
- homeassistant/components/tilt_pi/translations/id.json +11 -0
- homeassistant/components/tts/__init__.py +15 -0
- homeassistant/components/unifiprotect/translations/zh-Hans.json +3 -3
- homeassistant/components/utility_meter/translations/sv.json +9 -9
- homeassistant/components/vegehub/translations/bg.json +2 -0
- homeassistant/components/vegehub/translations/id.json +11 -0
- homeassistant/components/whirlpool/translations/sv.json +12 -12
- homeassistant/components/zha/translations/bg.json +23 -0
- homeassistant/components/zha/translations/el.json +10 -0
- homeassistant/components/zha/translations/ga.json +20 -0
- homeassistant/components/zha/translations/id.json +6 -0
- homeassistant/components/zha/translations/sv.json +15 -0
- homeassistant/components/zha/translations/zh-Hans.json +50 -0
- homeassistant/components/zwave_js/api.py +1 -1
- homeassistant/components/zwave_js/config_flow.py +12 -8
- homeassistant/components/zwave_js/manifest.json +1 -1
- homeassistant/config_entries.py +6 -0
- homeassistant/const.py +1 -1
- homeassistant/package_constraints.txt +1 -1
- {homeassistant-2025.7.0b0.dist-info → homeassistant-2025.7.0b1.dist-info}/METADATA +1 -1
- {homeassistant-2025.7.0b0.dist-info → homeassistant-2025.7.0b1.dist-info}/RECORD +208 -192
- {homeassistant-2025.7.0b0.dist-info → homeassistant-2025.7.0b1.dist-info}/WHEEL +0 -0
- {homeassistant-2025.7.0b0.dist-info → homeassistant-2025.7.0b1.dist-info}/entry_points.txt +0 -0
- {homeassistant-2025.7.0b0.dist-info → homeassistant-2025.7.0b1.dist-info}/licenses/LICENSE.md +0 -0
- {homeassistant-2025.7.0b0.dist-info → homeassistant-2025.7.0b1.dist-info}/licenses/homeassistant/backports/LICENSE.Python +0 -0
- {homeassistant-2025.7.0b0.dist-info → homeassistant-2025.7.0b1.dist-info}/top_level.txt +0 -0
|
@@ -47,13 +47,18 @@ from .const import (
|
|
|
47
47
|
CONF_TOP_P,
|
|
48
48
|
CONF_USE_GOOGLE_SEARCH_TOOL,
|
|
49
49
|
DEFAULT_CONVERSATION_NAME,
|
|
50
|
+
DEFAULT_TITLE,
|
|
51
|
+
DEFAULT_TTS_NAME,
|
|
50
52
|
DOMAIN,
|
|
51
53
|
RECOMMENDED_CHAT_MODEL,
|
|
54
|
+
RECOMMENDED_CONVERSATION_OPTIONS,
|
|
52
55
|
RECOMMENDED_HARM_BLOCK_THRESHOLD,
|
|
53
56
|
RECOMMENDED_MAX_TOKENS,
|
|
54
57
|
RECOMMENDED_TEMPERATURE,
|
|
55
58
|
RECOMMENDED_TOP_K,
|
|
56
59
|
RECOMMENDED_TOP_P,
|
|
60
|
+
RECOMMENDED_TTS_MODEL,
|
|
61
|
+
RECOMMENDED_TTS_OPTIONS,
|
|
57
62
|
RECOMMENDED_USE_GOOGLE_SEARCH_TOOL,
|
|
58
63
|
TIMEOUT_MILLIS,
|
|
59
64
|
)
|
|
@@ -66,12 +71,6 @@ STEP_API_DATA_SCHEMA = vol.Schema(
|
|
|
66
71
|
}
|
|
67
72
|
)
|
|
68
73
|
|
|
69
|
-
RECOMMENDED_OPTIONS = {
|
|
70
|
-
CONF_RECOMMENDED: True,
|
|
71
|
-
CONF_LLM_HASS_API: [llm.LLM_API_ASSIST],
|
|
72
|
-
CONF_PROMPT: llm.DEFAULT_INSTRUCTIONS_PROMPT,
|
|
73
|
-
}
|
|
74
|
-
|
|
75
74
|
|
|
76
75
|
async def validate_input(data: dict[str, Any]) -> None:
|
|
77
76
|
"""Validate the user input allows us to connect.
|
|
@@ -118,15 +117,21 @@ class GoogleGenerativeAIConfigFlow(ConfigFlow, domain=DOMAIN):
|
|
|
118
117
|
data=user_input,
|
|
119
118
|
)
|
|
120
119
|
return self.async_create_entry(
|
|
121
|
-
title=
|
|
120
|
+
title=DEFAULT_TITLE,
|
|
122
121
|
data=user_input,
|
|
123
122
|
subentries=[
|
|
124
123
|
{
|
|
125
124
|
"subentry_type": "conversation",
|
|
126
|
-
"data":
|
|
125
|
+
"data": RECOMMENDED_CONVERSATION_OPTIONS,
|
|
127
126
|
"title": DEFAULT_CONVERSATION_NAME,
|
|
128
127
|
"unique_id": None,
|
|
129
|
-
}
|
|
128
|
+
},
|
|
129
|
+
{
|
|
130
|
+
"subentry_type": "tts",
|
|
131
|
+
"data": RECOMMENDED_TTS_OPTIONS,
|
|
132
|
+
"title": DEFAULT_TTS_NAME,
|
|
133
|
+
"unique_id": None,
|
|
134
|
+
},
|
|
130
135
|
],
|
|
131
136
|
)
|
|
132
137
|
return self.async_show_form(
|
|
@@ -172,10 +177,13 @@ class GoogleGenerativeAIConfigFlow(ConfigFlow, domain=DOMAIN):
|
|
|
172
177
|
cls, config_entry: ConfigEntry
|
|
173
178
|
) -> dict[str, type[ConfigSubentryFlow]]:
|
|
174
179
|
"""Return subentries supported by this integration."""
|
|
175
|
-
return {
|
|
180
|
+
return {
|
|
181
|
+
"conversation": LLMSubentryFlowHandler,
|
|
182
|
+
"tts": LLMSubentryFlowHandler,
|
|
183
|
+
}
|
|
176
184
|
|
|
177
185
|
|
|
178
|
-
class
|
|
186
|
+
class LLMSubentryFlowHandler(ConfigSubentryFlow):
|
|
179
187
|
"""Flow for managing conversation subentries."""
|
|
180
188
|
|
|
181
189
|
last_rendered_recommended = False
|
|
@@ -202,7 +210,11 @@ class ConversationSubentryFlowHandler(ConfigSubentryFlow):
|
|
|
202
210
|
|
|
203
211
|
if user_input is None:
|
|
204
212
|
if self._is_new:
|
|
205
|
-
options
|
|
213
|
+
options: dict[str, Any]
|
|
214
|
+
if self._subentry_type == "tts":
|
|
215
|
+
options = RECOMMENDED_TTS_OPTIONS.copy()
|
|
216
|
+
else:
|
|
217
|
+
options = RECOMMENDED_CONVERSATION_OPTIONS.copy()
|
|
206
218
|
else:
|
|
207
219
|
# If this is a reconfiguration, we need to copy the existing options
|
|
208
220
|
# so that we can show the current values in the form.
|
|
@@ -216,7 +228,7 @@ class ConversationSubentryFlowHandler(ConfigSubentryFlow):
|
|
|
216
228
|
if user_input[CONF_RECOMMENDED] == self.last_rendered_recommended:
|
|
217
229
|
if not user_input.get(CONF_LLM_HASS_API):
|
|
218
230
|
user_input.pop(CONF_LLM_HASS_API, None)
|
|
219
|
-
# Don't allow to save options that enable the Google
|
|
231
|
+
# Don't allow to save options that enable the Google Search tool with an Assist API
|
|
220
232
|
if not (
|
|
221
233
|
user_input.get(CONF_LLM_HASS_API)
|
|
222
234
|
and user_input.get(CONF_USE_GOOGLE_SEARCH_TOOL, False) is True
|
|
@@ -240,7 +252,7 @@ class ConversationSubentryFlowHandler(ConfigSubentryFlow):
|
|
|
240
252
|
options = user_input
|
|
241
253
|
|
|
242
254
|
schema = await google_generative_ai_config_option_schema(
|
|
243
|
-
self.hass, self._is_new, options, self._genai_client
|
|
255
|
+
self.hass, self._is_new, self._subentry_type, options, self._genai_client
|
|
244
256
|
)
|
|
245
257
|
return self.async_show_form(
|
|
246
258
|
step_id="set_options", data_schema=vol.Schema(schema), errors=errors
|
|
@@ -253,6 +265,7 @@ class ConversationSubentryFlowHandler(ConfigSubentryFlow):
|
|
|
253
265
|
async def google_generative_ai_config_option_schema(
|
|
254
266
|
hass: HomeAssistant,
|
|
255
267
|
is_new: bool,
|
|
268
|
+
subentry_type: str,
|
|
256
269
|
options: Mapping[str, Any],
|
|
257
270
|
genai_client: genai.Client,
|
|
258
271
|
) -> dict:
|
|
@@ -270,26 +283,39 @@ async def google_generative_ai_config_option_schema(
|
|
|
270
283
|
suggested_llm_apis = [suggested_llm_apis]
|
|
271
284
|
|
|
272
285
|
if is_new:
|
|
286
|
+
if CONF_NAME in options:
|
|
287
|
+
default_name = options[CONF_NAME]
|
|
288
|
+
elif subentry_type == "tts":
|
|
289
|
+
default_name = DEFAULT_TTS_NAME
|
|
290
|
+
else:
|
|
291
|
+
default_name = DEFAULT_CONVERSATION_NAME
|
|
273
292
|
schema: dict[vol.Required | vol.Optional, Any] = {
|
|
274
|
-
vol.Required(CONF_NAME, default=
|
|
293
|
+
vol.Required(CONF_NAME, default=default_name): str,
|
|
275
294
|
}
|
|
276
295
|
else:
|
|
277
296
|
schema = {}
|
|
278
297
|
|
|
298
|
+
if subentry_type == "conversation":
|
|
299
|
+
schema.update(
|
|
300
|
+
{
|
|
301
|
+
vol.Optional(
|
|
302
|
+
CONF_PROMPT,
|
|
303
|
+
description={
|
|
304
|
+
"suggested_value": options.get(
|
|
305
|
+
CONF_PROMPT, llm.DEFAULT_INSTRUCTIONS_PROMPT
|
|
306
|
+
)
|
|
307
|
+
},
|
|
308
|
+
): TemplateSelector(),
|
|
309
|
+
vol.Optional(
|
|
310
|
+
CONF_LLM_HASS_API,
|
|
311
|
+
description={"suggested_value": suggested_llm_apis},
|
|
312
|
+
): SelectSelector(
|
|
313
|
+
SelectSelectorConfig(options=hass_apis, multiple=True)
|
|
314
|
+
),
|
|
315
|
+
}
|
|
316
|
+
)
|
|
279
317
|
schema.update(
|
|
280
318
|
{
|
|
281
|
-
vol.Optional(
|
|
282
|
-
CONF_PROMPT,
|
|
283
|
-
description={
|
|
284
|
-
"suggested_value": options.get(
|
|
285
|
-
CONF_PROMPT, llm.DEFAULT_INSTRUCTIONS_PROMPT
|
|
286
|
-
)
|
|
287
|
-
},
|
|
288
|
-
): TemplateSelector(),
|
|
289
|
-
vol.Optional(
|
|
290
|
-
CONF_LLM_HASS_API,
|
|
291
|
-
description={"suggested_value": suggested_llm_apis},
|
|
292
|
-
): SelectSelector(SelectSelectorConfig(options=hass_apis, multiple=True)),
|
|
293
319
|
vol.Required(
|
|
294
320
|
CONF_RECOMMENDED, default=options.get(CONF_RECOMMENDED, False)
|
|
295
321
|
): bool,
|
|
@@ -310,7 +336,7 @@ async def google_generative_ai_config_option_schema(
|
|
|
310
336
|
if (
|
|
311
337
|
api_model.display_name
|
|
312
338
|
and api_model.name
|
|
313
|
-
and "tts"
|
|
339
|
+
and ("tts" in api_model.name) == (subentry_type == "tts")
|
|
314
340
|
and "vision" not in api_model.name
|
|
315
341
|
and api_model.supported_actions
|
|
316
342
|
and "generateContent" in api_model.supported_actions
|
|
@@ -341,12 +367,17 @@ async def google_generative_ai_config_option_schema(
|
|
|
341
367
|
)
|
|
342
368
|
)
|
|
343
369
|
|
|
370
|
+
if subentry_type == "tts":
|
|
371
|
+
default_model = RECOMMENDED_TTS_MODEL
|
|
372
|
+
else:
|
|
373
|
+
default_model = RECOMMENDED_CHAT_MODEL
|
|
374
|
+
|
|
344
375
|
schema.update(
|
|
345
376
|
{
|
|
346
377
|
vol.Optional(
|
|
347
378
|
CONF_CHAT_MODEL,
|
|
348
379
|
description={"suggested_value": options.get(CONF_CHAT_MODEL)},
|
|
349
|
-
default=
|
|
380
|
+
default=default_model,
|
|
350
381
|
): SelectSelector(
|
|
351
382
|
SelectSelectorConfig(mode=SelectSelectorMode.DROPDOWN, options=models)
|
|
352
383
|
),
|
|
@@ -396,13 +427,18 @@ async def google_generative_ai_config_option_schema(
|
|
|
396
427
|
},
|
|
397
428
|
default=RECOMMENDED_HARM_BLOCK_THRESHOLD,
|
|
398
429
|
): harm_block_thresholds_selector,
|
|
399
|
-
vol.Optional(
|
|
400
|
-
CONF_USE_GOOGLE_SEARCH_TOOL,
|
|
401
|
-
description={
|
|
402
|
-
"suggested_value": options.get(CONF_USE_GOOGLE_SEARCH_TOOL),
|
|
403
|
-
},
|
|
404
|
-
default=RECOMMENDED_USE_GOOGLE_SEARCH_TOOL,
|
|
405
|
-
): bool,
|
|
406
430
|
}
|
|
407
431
|
)
|
|
432
|
+
if subentry_type == "conversation":
|
|
433
|
+
schema.update(
|
|
434
|
+
{
|
|
435
|
+
vol.Optional(
|
|
436
|
+
CONF_USE_GOOGLE_SEARCH_TOOL,
|
|
437
|
+
description={
|
|
438
|
+
"suggested_value": options.get(CONF_USE_GOOGLE_SEARCH_TOOL),
|
|
439
|
+
},
|
|
440
|
+
default=RECOMMENDED_USE_GOOGLE_SEARCH_TOOL,
|
|
441
|
+
): bool,
|
|
442
|
+
}
|
|
443
|
+
)
|
|
408
444
|
return schema
|
|
@@ -2,17 +2,21 @@
|
|
|
2
2
|
|
|
3
3
|
import logging
|
|
4
4
|
|
|
5
|
+
from homeassistant.const import CONF_LLM_HASS_API
|
|
6
|
+
from homeassistant.helpers import llm
|
|
7
|
+
|
|
5
8
|
DOMAIN = "google_generative_ai_conversation"
|
|
9
|
+
DEFAULT_TITLE = "Google Generative AI"
|
|
6
10
|
LOGGER = logging.getLogger(__package__)
|
|
7
11
|
CONF_PROMPT = "prompt"
|
|
8
12
|
|
|
9
13
|
DEFAULT_CONVERSATION_NAME = "Google AI Conversation"
|
|
14
|
+
DEFAULT_TTS_NAME = "Google AI TTS"
|
|
10
15
|
|
|
11
|
-
ATTR_MODEL = "model"
|
|
12
16
|
CONF_RECOMMENDED = "recommended"
|
|
13
17
|
CONF_CHAT_MODEL = "chat_model"
|
|
14
18
|
RECOMMENDED_CHAT_MODEL = "models/gemini-2.5-flash"
|
|
15
|
-
RECOMMENDED_TTS_MODEL = "gemini-2.5-flash-preview-tts"
|
|
19
|
+
RECOMMENDED_TTS_MODEL = "models/gemini-2.5-flash-preview-tts"
|
|
16
20
|
CONF_TEMPERATURE = "temperature"
|
|
17
21
|
RECOMMENDED_TEMPERATURE = 1.0
|
|
18
22
|
CONF_TOP_P = "top_p"
|
|
@@ -31,3 +35,12 @@ RECOMMENDED_USE_GOOGLE_SEARCH_TOOL = False
|
|
|
31
35
|
|
|
32
36
|
TIMEOUT_MILLIS = 10000
|
|
33
37
|
FILE_POLLING_INTERVAL_SECONDS = 0.05
|
|
38
|
+
RECOMMENDED_CONVERSATION_OPTIONS = {
|
|
39
|
+
CONF_PROMPT: llm.DEFAULT_INSTRUCTIONS_PROMPT,
|
|
40
|
+
CONF_LLM_HASS_API: [llm.LLM_API_ASSIST],
|
|
41
|
+
CONF_RECOMMENDED: True,
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
RECOMMENDED_TTS_OPTIONS = {
|
|
45
|
+
CONF_RECOMMENDED: True,
|
|
46
|
+
}
|
|
@@ -301,7 +301,12 @@ async def _transform_stream(
|
|
|
301
301
|
class GoogleGenerativeAILLMBaseEntity(Entity):
|
|
302
302
|
"""Google Generative AI base entity."""
|
|
303
303
|
|
|
304
|
-
def __init__(
|
|
304
|
+
def __init__(
|
|
305
|
+
self,
|
|
306
|
+
entry: ConfigEntry,
|
|
307
|
+
subentry: ConfigSubentry,
|
|
308
|
+
default_model: str = RECOMMENDED_CHAT_MODEL,
|
|
309
|
+
) -> None:
|
|
305
310
|
"""Initialize the agent."""
|
|
306
311
|
self.entry = entry
|
|
307
312
|
self.subentry = subentry
|
|
@@ -312,7 +317,7 @@ class GoogleGenerativeAILLMBaseEntity(Entity):
|
|
|
312
317
|
identifiers={(DOMAIN, subentry.subentry_id)},
|
|
313
318
|
name=subentry.title,
|
|
314
319
|
manufacturer="Google",
|
|
315
|
-
model=
|
|
320
|
+
model=subentry.data.get(CONF_CHAT_MODEL, default_model).split("/")[-1],
|
|
316
321
|
entry_type=dr.DeviceEntryType.SERVICE,
|
|
317
322
|
)
|
|
318
323
|
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
"""Helper classes for Google Generative AI integration."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from contextlib import suppress
|
|
6
|
+
import io
|
|
7
|
+
import wave
|
|
8
|
+
|
|
9
|
+
from homeassistant.exceptions import HomeAssistantError
|
|
10
|
+
|
|
11
|
+
from .const import LOGGER
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
def convert_to_wav(audio_data: bytes, mime_type: str) -> bytes:
|
|
15
|
+
"""Generate a WAV file header for the given audio data and parameters.
|
|
16
|
+
|
|
17
|
+
Args:
|
|
18
|
+
audio_data: The raw audio data as a bytes object.
|
|
19
|
+
mime_type: Mime type of the audio data.
|
|
20
|
+
|
|
21
|
+
Returns:
|
|
22
|
+
A bytes object representing the WAV file header.
|
|
23
|
+
|
|
24
|
+
"""
|
|
25
|
+
parameters = _parse_audio_mime_type(mime_type)
|
|
26
|
+
|
|
27
|
+
wav_buffer = io.BytesIO()
|
|
28
|
+
with wave.open(wav_buffer, "wb") as wf:
|
|
29
|
+
wf.setnchannels(1)
|
|
30
|
+
wf.setsampwidth(parameters["bits_per_sample"] // 8)
|
|
31
|
+
wf.setframerate(parameters["rate"])
|
|
32
|
+
wf.writeframes(audio_data)
|
|
33
|
+
|
|
34
|
+
return wav_buffer.getvalue()
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
# Below code is from https://aistudio.google.com/app/generate-speech
|
|
38
|
+
# when you select "Get SDK code to generate speech".
|
|
39
|
+
def _parse_audio_mime_type(mime_type: str) -> dict[str, int]:
|
|
40
|
+
"""Parse bits per sample and rate from an audio MIME type string.
|
|
41
|
+
|
|
42
|
+
Assumes bits per sample is encoded like "L16" and rate as "rate=xxxxx".
|
|
43
|
+
|
|
44
|
+
Args:
|
|
45
|
+
mime_type: The audio MIME type string (e.g., "audio/L16;rate=24000").
|
|
46
|
+
|
|
47
|
+
Returns:
|
|
48
|
+
A dictionary with "bits_per_sample" and "rate" keys. Values will be
|
|
49
|
+
integers if found, otherwise None.
|
|
50
|
+
|
|
51
|
+
"""
|
|
52
|
+
if not mime_type.startswith("audio/L"):
|
|
53
|
+
LOGGER.warning("Received unexpected MIME type %s", mime_type)
|
|
54
|
+
raise HomeAssistantError(f"Unsupported audio MIME type: {mime_type}")
|
|
55
|
+
|
|
56
|
+
bits_per_sample = 16
|
|
57
|
+
rate = 24000
|
|
58
|
+
|
|
59
|
+
# Extract rate from parameters
|
|
60
|
+
parts = mime_type.split(";")
|
|
61
|
+
for param in parts: # Skip the main type part
|
|
62
|
+
param = param.strip()
|
|
63
|
+
if param.lower().startswith("rate="):
|
|
64
|
+
# Handle cases like "rate=" with no value or non-integer value and keep rate as default
|
|
65
|
+
with suppress(ValueError, IndexError):
|
|
66
|
+
rate_str = param.split("=", 1)[1]
|
|
67
|
+
rate = int(rate_str)
|
|
68
|
+
elif param.startswith("audio/L"):
|
|
69
|
+
# Keep bits_per_sample as default if conversion fails
|
|
70
|
+
with suppress(ValueError, IndexError):
|
|
71
|
+
bits_per_sample = int(param.split("L", 1)[1])
|
|
72
|
+
|
|
73
|
+
return {"bits_per_sample": bits_per_sample, "rate": rate}
|
|
@@ -29,7 +29,6 @@
|
|
|
29
29
|
"reconfigure": "Reconfigure conversation agent"
|
|
30
30
|
},
|
|
31
31
|
"entry_type": "Conversation agent",
|
|
32
|
-
|
|
33
32
|
"step": {
|
|
34
33
|
"set_options": {
|
|
35
34
|
"data": {
|
|
@@ -61,6 +60,34 @@
|
|
|
61
60
|
"error": {
|
|
62
61
|
"invalid_google_search_option": "Google Search can only be enabled if nothing is selected in the \"Control Home Assistant\" setting."
|
|
63
62
|
}
|
|
63
|
+
},
|
|
64
|
+
"tts": {
|
|
65
|
+
"initiate_flow": {
|
|
66
|
+
"user": "Add Text-to-Speech service",
|
|
67
|
+
"reconfigure": "Reconfigure Text-to-Speech service"
|
|
68
|
+
},
|
|
69
|
+
"entry_type": "Text-to-Speech",
|
|
70
|
+
"step": {
|
|
71
|
+
"set_options": {
|
|
72
|
+
"data": {
|
|
73
|
+
"name": "[%key:common::config_flow::data::name%]",
|
|
74
|
+
"recommended": "[%key:component::google_generative_ai_conversation::config_subentries::conversation::step::set_options::data::recommended%]",
|
|
75
|
+
"chat_model": "[%key:common::generic::model%]",
|
|
76
|
+
"temperature": "[%key:component::google_generative_ai_conversation::config_subentries::conversation::step::set_options::data::temperature%]",
|
|
77
|
+
"top_p": "[%key:component::google_generative_ai_conversation::config_subentries::conversation::step::set_options::data::top_p%]",
|
|
78
|
+
"top_k": "[%key:component::google_generative_ai_conversation::config_subentries::conversation::step::set_options::data::top_k%]",
|
|
79
|
+
"max_tokens": "[%key:component::google_generative_ai_conversation::config_subentries::conversation::step::set_options::data::max_tokens%]",
|
|
80
|
+
"harassment_block_threshold": "[%key:component::google_generative_ai_conversation::config_subentries::conversation::step::set_options::data::harassment_block_threshold%]",
|
|
81
|
+
"hate_block_threshold": "[%key:component::google_generative_ai_conversation::config_subentries::conversation::step::set_options::data::hate_block_threshold%]",
|
|
82
|
+
"sexual_block_threshold": "[%key:component::google_generative_ai_conversation::config_subentries::conversation::step::set_options::data::sexual_block_threshold%]",
|
|
83
|
+
"dangerous_block_threshold": "[%key:component::google_generative_ai_conversation::config_subentries::conversation::step::set_options::data::dangerous_block_threshold%]"
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
},
|
|
87
|
+
"abort": {
|
|
88
|
+
"entry_not_loaded": "[%key:component::google_generative_ai_conversation::config_subentries::conversation::abort::entry_not_loaded%]",
|
|
89
|
+
"reconfigure_successful": "[%key:common::config_flow::abort::reconfigure_successful%]"
|
|
90
|
+
}
|
|
64
91
|
}
|
|
65
92
|
},
|
|
66
93
|
"services": {
|
|
@@ -34,6 +34,25 @@
|
|
|
34
34
|
"llm_hass_api": "\u0423\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043d\u0430 Home Assistant",
|
|
35
35
|
"name": "\u0418\u043c\u0435",
|
|
36
36
|
"prompt": "\u0418\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438",
|
|
37
|
+
"recommended": "\u041f\u0440\u0435\u043f\u043e\u0440\u044a\u0447\u0438\u0442\u0435\u043b\u043d\u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u043d\u0430 \u043c\u043e\u0434\u0435\u043b\u0430",
|
|
38
|
+
"sexual_block_threshold": "\u0421\u044a\u0434\u044a\u0440\u0436\u0430 \u043f\u0440\u0435\u043f\u0440\u0430\u0442\u043a\u0438 \u043a\u044a\u043c \u0441\u0435\u043a\u0441\u0443\u0430\u043b\u043d\u0438 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0438\u043b\u0438 \u0434\u0440\u0443\u0433\u043e \u043d\u0435\u043f\u0440\u0438\u043b\u0438\u0447\u043d\u043e \u0441\u044a\u0434\u044a\u0440\u0436\u0430\u043d\u0438\u0435",
|
|
39
|
+
"temperature": "\u0422\u0435\u043c\u043f\u0435\u0440\u0430\u0442\u0443\u0440\u0430"
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
},
|
|
44
|
+
"tts": {
|
|
45
|
+
"abort": {
|
|
46
|
+
"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"
|
|
47
|
+
},
|
|
48
|
+
"entry_type": "\u041f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u0432\u0430\u043d\u0435 \u043d\u0430 \u0442\u0435\u043a\u0441\u0442 \u0432 \u0440\u0435\u0447",
|
|
49
|
+
"step": {
|
|
50
|
+
"set_options": {
|
|
51
|
+
"data": {
|
|
52
|
+
"chat_model": "\u041c\u043e\u0434\u0435\u043b",
|
|
53
|
+
"name": "\u0418\u043c\u0435",
|
|
54
|
+
"recommended": "\u041f\u0440\u0435\u043f\u043e\u0440\u044a\u0447\u0438\u0442\u0435\u043b\u043d\u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u043d\u0430 \u043c\u043e\u0434\u0435\u043b\u0430",
|
|
55
|
+
"sexual_block_threshold": "\u0421\u044a\u0434\u044a\u0440\u0436\u0430 \u043f\u0440\u0435\u043f\u0440\u0430\u0442\u043a\u0438 \u043a\u044a\u043c \u0441\u0435\u043a\u0441\u0443\u0430\u043b\u043d\u0438 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0438\u043b\u0438 \u0434\u0440\u0443\u0433\u043e \u043d\u0435\u043f\u0440\u0438\u043b\u0438\u0447\u043d\u043e \u0441\u044a\u0434\u044a\u0440\u0436\u0430\u043d\u0438\u0435",
|
|
37
56
|
"temperature": "\u0422\u0435\u043c\u043f\u0435\u0440\u0430\u0442\u0443\u0440\u0430"
|
|
38
57
|
}
|
|
39
58
|
}
|
|
@@ -60,6 +60,34 @@
|
|
|
60
60
|
}
|
|
61
61
|
}
|
|
62
62
|
}
|
|
63
|
+
},
|
|
64
|
+
"tts": {
|
|
65
|
+
"abort": {
|
|
66
|
+
"entry_not_loaded": "Es k\u00f6nnen keine Dinge hinzugef\u00fcgt werden, wenn die Konfiguration deaktiviert ist.",
|
|
67
|
+
"reconfigure_successful": "Die Neukonfiguration war erfolgreich"
|
|
68
|
+
},
|
|
69
|
+
"entry_type": "Text-zu-Sprache",
|
|
70
|
+
"initiate_flow": {
|
|
71
|
+
"reconfigure": "Text-zu-Sprache-Dienst neu konfigurieren",
|
|
72
|
+
"user": "Text-zu-Sprache-Dienst hinzuf\u00fcgen"
|
|
73
|
+
},
|
|
74
|
+
"step": {
|
|
75
|
+
"set_options": {
|
|
76
|
+
"data": {
|
|
77
|
+
"chat_model": "Modell",
|
|
78
|
+
"dangerous_block_threshold": "F\u00f6rderung, Erleichterung oder Ermutigung sch\u00e4dlicher Handlungen",
|
|
79
|
+
"harassment_block_threshold": "Negative oder verletzende Kommentare, die auf die Identit\u00e4t und/oder gesch\u00fctzte Attribute abzielen",
|
|
80
|
+
"hate_block_threshold": "Inhalte, die unh\u00f6flich, respektlos oder profan sind",
|
|
81
|
+
"max_tokens": "Maximale Anzahl an Token, die als Antwort zur\u00fcckgegeben werden",
|
|
82
|
+
"name": "Name",
|
|
83
|
+
"recommended": "Empfohlene Modelleinstellungen",
|
|
84
|
+
"sexual_block_threshold": "Hinweise auf sexuelle Handlungen oder andere anst\u00f6\u00dfige Inhalte",
|
|
85
|
+
"temperature": "Temperatur",
|
|
86
|
+
"top_k": "Top K",
|
|
87
|
+
"top_p": "Top P"
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
}
|
|
63
91
|
}
|
|
64
92
|
},
|
|
65
93
|
"issues": {
|
|
@@ -60,6 +60,34 @@
|
|
|
60
60
|
}
|
|
61
61
|
}
|
|
62
62
|
}
|
|
63
|
+
},
|
|
64
|
+
"tts": {
|
|
65
|
+
"abort": {
|
|
66
|
+
"entry_not_loaded": "\u0394\u03b5\u03bd \u03b5\u03af\u03bd\u03b1\u03b9 \u03b4\u03c5\u03bd\u03b1\u03c4\u03ae \u03b7 \u03c0\u03c1\u03bf\u03c3\u03b8\u03ae\u03ba\u03b7 \u03c3\u03c4\u03bf\u03b9\u03c7\u03b5\u03af\u03c9\u03bd \u03cc\u03c3\u03bf \u03b7 \u03b4\u03b9\u03b1\u03bc\u03cc\u03c1\u03c6\u03c9\u03c3\u03b7 \u03b5\u03af\u03bd\u03b1\u03b9 \u03b1\u03c0\u03b5\u03bd\u03b5\u03c1\u03b3\u03bf\u03c0\u03bf\u03b9\u03b7\u03bc\u03ad\u03bd\u03b7.",
|
|
67
|
+
"reconfigure_successful": "\u0397 \u03b5\u03ba \u03bd\u03ad\u03bf\u03c5 \u03b4\u03b9\u03b1\u03bc\u03cc\u03c1\u03c6\u03c9\u03c3\u03b7 \u03ae\u03c4\u03b1\u03bd \u03b5\u03c0\u03b9\u03c4\u03c5\u03c7\u03ae\u03c2"
|
|
68
|
+
},
|
|
69
|
+
"entry_type": "\u039c\u03b5\u03c4\u03b1\u03c4\u03c1\u03bf\u03c0\u03ae \u03ba\u03b5\u03b9\u03bc\u03ad\u03bd\u03bf\u03c5 \u03c3\u03b5 \u03bf\u03bc\u03b9\u03bb\u03af\u03b1",
|
|
70
|
+
"initiate_flow": {
|
|
71
|
+
"reconfigure": "\u0395\u03c0\u03b1\u03bd\u03b1\u03b4\u03b9\u03b1\u03bc\u03cc\u03c1\u03c6\u03c9\u03c3\u03b7 \u03c5\u03c0\u03b7\u03c1\u03b5\u03c3\u03af\u03b1\u03c2 \u03bc\u03b5\u03c4\u03b1\u03c4\u03c1\u03bf\u03c0\u03ae\u03c2 \u03ba\u03b5\u03b9\u03bc\u03ad\u03bd\u03bf\u03c5 \u03c3\u03b5 \u03bf\u03bc\u03b9\u03bb\u03af\u03b1",
|
|
72
|
+
"user": "\u03a0\u03c1\u03bf\u03c3\u03b8\u03ae\u03ba\u03b7 \u03c5\u03c0\u03b7\u03c1\u03b5\u03c3\u03af\u03b1\u03c2 \u03bc\u03b5\u03c4\u03b1\u03c4\u03c1\u03bf\u03c0\u03ae\u03c2 \u03ba\u03b5\u03b9\u03bc\u03ad\u03bd\u03bf\u03c5 \u03c3\u03b5 \u03bf\u03bc\u03b9\u03bb\u03af\u03b1"
|
|
73
|
+
},
|
|
74
|
+
"step": {
|
|
75
|
+
"set_options": {
|
|
76
|
+
"data": {
|
|
77
|
+
"chat_model": "\u039c\u03bf\u03bd\u03c4\u03ad\u03bb\u03bf",
|
|
78
|
+
"dangerous_block_threshold": "\u03a0\u03c1\u03bf\u03c9\u03b8\u03b5\u03af, \u03b4\u03b9\u03b5\u03c5\u03ba\u03bf\u03bb\u03cd\u03bd\u03b5\u03b9 \u03ae \u03b5\u03bd\u03b8\u03b1\u03c1\u03c1\u03cd\u03bd\u03b5\u03b9 \u03b5\u03c0\u03b9\u03b2\u03bb\u03b1\u03b2\u03b5\u03af\u03c2 \u03c0\u03c1\u03ac\u03be\u03b5\u03b9\u03c2",
|
|
79
|
+
"harassment_block_threshold": "\u0391\u03c1\u03bd\u03b7\u03c4\u03b9\u03ba\u03ac \u03ae \u03b5\u03c0\u03b9\u03b2\u03bb\u03b1\u03b2\u03ae \u03c3\u03c7\u03cc\u03bb\u03b9\u03b1 \u03bc\u03b5 \u03c3\u03c4\u03cc\u03c7\u03bf \u03c4\u03b7\u03bd \u03c4\u03b1\u03c5\u03c4\u03cc\u03c4\u03b7\u03c4\u03b1 \u03ae/\u03ba\u03b1\u03b9 \u03c0\u03c1\u03bf\u03c3\u03c4\u03b1\u03c4\u03b5\u03c5\u03cc\u03bc\u03b5\u03bd\u03b1 \u03c7\u03b1\u03c1\u03b1\u03ba\u03c4\u03b7\u03c1\u03b9\u03c3\u03c4\u03b9\u03ba\u03ac",
|
|
80
|
+
"hate_block_threshold": "\u03a0\u03b5\u03c1\u03b9\u03b5\u03c7\u03cc\u03bc\u03b5\u03bd\u03bf \u03c0\u03bf\u03c5 \u03b5\u03af\u03bd\u03b1\u03b9 \u03b1\u03b3\u03b5\u03bd\u03ad\u03c2, \u03b1\u03c3\u03b5\u03b2\u03ad\u03c2 \u03ae \u03b2\u03bb\u03ac\u03c3\u03c6\u03b7\u03bc\u03bf",
|
|
81
|
+
"max_tokens": "\u039c\u03ad\u03b3\u03b9\u03c3\u03c4\u03bf\u03c2 \u03b1\u03c1\u03b9\u03b8\u03bc\u03cc\u03c2 tokens \u03c0\u03bf\u03c5 \u03b5\u03c0\u03b9\u03c3\u03c4\u03c1\u03ad\u03c6\u03bf\u03bd\u03c4\u03b1\u03b9 \u03c3\u03c4\u03b7\u03bd \u03b1\u03c0\u03ac\u03bd\u03c4\u03b7\u03c3\u03b7",
|
|
82
|
+
"name": "\u039f\u03bd\u03bf\u03bc\u03b1",
|
|
83
|
+
"recommended": "\u03a0\u03c1\u03bf\u03c4\u03b5\u03b9\u03bd\u03cc\u03bc\u03b5\u03bd\u03b5\u03c2 \u03c1\u03c5\u03b8\u03bc\u03af\u03c3\u03b5\u03b9\u03c2 \u03bc\u03bf\u03bd\u03c4\u03ad\u03bb\u03bf\u03c5",
|
|
84
|
+
"sexual_block_threshold": "\u03a0\u03b5\u03c1\u03b9\u03ad\u03c7\u03b5\u03b9 \u03b1\u03bd\u03b1\u03c6\u03bf\u03c1\u03ad\u03c2 \u03c3\u03b5 \u03c3\u03b5\u03be\u03bf\u03c5\u03b1\u03bb\u03b9\u03ba\u03ad\u03c2 \u03c0\u03c1\u03ac\u03be\u03b5\u03b9\u03c2 \u03ae \u03ac\u03bb\u03bb\u03bf \u03ac\u03c3\u03b5\u03bc\u03bd\u03bf \u03c0\u03b5\u03c1\u03b9\u03b5\u03c7\u03cc\u03bc\u03b5\u03bd\u03bf",
|
|
85
|
+
"temperature": "\u0398\u03b5\u03c1\u03bc\u03bf\u03ba\u03c1\u03b1\u03c3\u03af\u03b1",
|
|
86
|
+
"top_k": "Top K",
|
|
87
|
+
"top_p": "Top P"
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
}
|
|
63
91
|
}
|
|
64
92
|
},
|
|
65
93
|
"issues": {
|
|
@@ -60,6 +60,34 @@
|
|
|
60
60
|
}
|
|
61
61
|
}
|
|
62
62
|
}
|
|
63
|
+
},
|
|
64
|
+
"tts": {
|
|
65
|
+
"abort": {
|
|
66
|
+
"entry_not_loaded": "Cannot add things while the configuration is disabled.",
|
|
67
|
+
"reconfigure_successful": "Re-configuration was successful"
|
|
68
|
+
},
|
|
69
|
+
"entry_type": "Text-to-Speech",
|
|
70
|
+
"initiate_flow": {
|
|
71
|
+
"reconfigure": "Reconfigure Text-to-Speech service",
|
|
72
|
+
"user": "Add Text-to-Speech service"
|
|
73
|
+
},
|
|
74
|
+
"step": {
|
|
75
|
+
"set_options": {
|
|
76
|
+
"data": {
|
|
77
|
+
"chat_model": "Model",
|
|
78
|
+
"dangerous_block_threshold": "Promotes, facilitates, or encourages harmful acts",
|
|
79
|
+
"harassment_block_threshold": "Negative or harmful comments targeting identity and/or protected attributes",
|
|
80
|
+
"hate_block_threshold": "Content that is rude, disrespectful, or profane",
|
|
81
|
+
"max_tokens": "Maximum tokens to return in response",
|
|
82
|
+
"name": "Name",
|
|
83
|
+
"recommended": "Recommended model settings",
|
|
84
|
+
"sexual_block_threshold": "Contains references to sexual acts or other lewd content",
|
|
85
|
+
"temperature": "Temperature",
|
|
86
|
+
"top_k": "Top K",
|
|
87
|
+
"top_p": "Top P"
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
}
|
|
63
91
|
}
|
|
64
92
|
},
|
|
65
93
|
"issues": {
|
|
@@ -60,6 +60,34 @@
|
|
|
60
60
|
}
|
|
61
61
|
}
|
|
62
62
|
}
|
|
63
|
+
},
|
|
64
|
+
"tts": {
|
|
65
|
+
"abort": {
|
|
66
|
+
"entry_not_loaded": "No se pueden a\u00f1adir cosas mientras la configuraci\u00f3n est\u00e1 desactivada.",
|
|
67
|
+
"reconfigure_successful": "Se volvi\u00f3 a configurar correctamente"
|
|
68
|
+
},
|
|
69
|
+
"entry_type": "Texto a voz",
|
|
70
|
+
"initiate_flow": {
|
|
71
|
+
"reconfigure": "Volver a configurar el servicio de texto a voz",
|
|
72
|
+
"user": "A\u00f1adir servicio de texto a voz"
|
|
73
|
+
},
|
|
74
|
+
"step": {
|
|
75
|
+
"set_options": {
|
|
76
|
+
"data": {
|
|
77
|
+
"chat_model": "Modelo",
|
|
78
|
+
"dangerous_block_threshold": "Promueve, facilita o fomenta actos da\u00f1inos",
|
|
79
|
+
"harassment_block_threshold": "Comentarios negativos o perjudiciales sobre la identidad y/o atributos protegidos",
|
|
80
|
+
"hate_block_threshold": "Contenido grosero, irrespetuoso o profano",
|
|
81
|
+
"max_tokens": "M\u00e1ximo de tokens para devolver en respuesta",
|
|
82
|
+
"name": "Nombre",
|
|
83
|
+
"recommended": "Ajustes recomendados del modelo",
|
|
84
|
+
"sexual_block_threshold": "Contiene referencias a actos sexuales u otros contenidos lascivos",
|
|
85
|
+
"temperature": "Temperatura",
|
|
86
|
+
"top_k": "Top K",
|
|
87
|
+
"top_p": "Top P"
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
}
|
|
63
91
|
}
|
|
64
92
|
},
|
|
65
93
|
"issues": {
|
|
@@ -60,6 +60,34 @@
|
|
|
60
60
|
}
|
|
61
61
|
}
|
|
62
62
|
}
|
|
63
|
+
},
|
|
64
|
+
"tts": {
|
|
65
|
+
"abort": {
|
|
66
|
+
"entry_not_loaded": "Asju ei saa lisada kui konfiguratsioon on keelatud.",
|
|
67
|
+
"reconfigure_successful": "\u00dcmberseadistamine \u00f5nnestus"
|
|
68
|
+
},
|
|
69
|
+
"entry_type": "Tekst k\u00f5neks",
|
|
70
|
+
"initiate_flow": {
|
|
71
|
+
"reconfigure": "Tekst k\u00f5neks teenuse \u00fcmberseadistamine",
|
|
72
|
+
"user": "Tekst k\u00f5neks teenuse lisamine"
|
|
73
|
+
},
|
|
74
|
+
"step": {
|
|
75
|
+
"set_options": {
|
|
76
|
+
"data": {
|
|
77
|
+
"chat_model": "Mudel",
|
|
78
|
+
"dangerous_block_threshold": "Propageerib, h\u00f5lbustab v\u00f5i julgustab kahjulikke tegusid",
|
|
79
|
+
"harassment_block_threshold": "Negatiivsed v\u00f5i kahjulikud kommentaarid, mis sihivad identiteeti ja/v\u00f5i kaitstud atribuute",
|
|
80
|
+
"hate_block_threshold": "Ebaviisakas, lugupidamatu v\u00f5i r\u00f5ve sisu.",
|
|
81
|
+
"max_tokens": "Vastuseks tagastatavate fraaside maksimaalne arv",
|
|
82
|
+
"name": "Nimi",
|
|
83
|
+
"recommended": "Soovitatavad mudeli seaded",
|
|
84
|
+
"sexual_block_threshold": "Sisaldab viiteid seksuaalaktidele v\u00f5i muule siivutule sisule",
|
|
85
|
+
"temperature": "Temperatuur",
|
|
86
|
+
"top_k": "\u00dclemine K",
|
|
87
|
+
"top_p": "\u00dclemine P"
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
}
|
|
63
91
|
}
|
|
64
92
|
},
|
|
65
93
|
"issues": {
|
|
@@ -1,4 +1,13 @@
|
|
|
1
1
|
{
|
|
2
|
+
"config_subentries": {
|
|
3
|
+
"tts": {
|
|
4
|
+
"entry_type": "T\u00e9acs-go-Caint",
|
|
5
|
+
"initiate_flow": {
|
|
6
|
+
"reconfigure": "Athchumraigh an tseirbh\u00eds T\u00e9acs-go-Caint",
|
|
7
|
+
"user": "Cuir seirbh\u00eds T\u00e9acs-go-Caint leis"
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
},
|
|
2
11
|
"issues": {
|
|
3
12
|
"deprecated_image_filename_parameter": {
|
|
4
13
|
"description": "T\u00e1 an paraim\u00e9adar 'image_filename' i ngn\u00edomhartha Google Generative AI imithe i l\u00e9ig. Cuir scripteanna agus uathoibrithe in eagar chun 'filenames' a \u00fas\u00e1id ina ionad.",
|