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.
Files changed (208) hide show
  1. homeassistant/components/aemet/sensor.py +1 -1
  2. homeassistant/components/airq/coordinator.py +2 -2
  3. homeassistant/components/alexa_devices/__init__.py +5 -2
  4. homeassistant/components/alexa_devices/notify.py +2 -0
  5. homeassistant/components/alexa_devices/quality_scale.yaml +1 -1
  6. homeassistant/components/alexa_devices/strings.json +11 -4
  7. homeassistant/components/alexa_devices/switch.py +2 -0
  8. homeassistant/components/alexa_devices/translations/bg.json +6 -4
  9. homeassistant/components/alexa_devices/translations/cs.json +0 -4
  10. homeassistant/components/alexa_devices/translations/de.json +6 -7
  11. homeassistant/components/alexa_devices/translations/el.json +4 -5
  12. homeassistant/components/alexa_devices/translations/en.json +12 -5
  13. homeassistant/components/alexa_devices/translations/es.json +0 -4
  14. homeassistant/components/alexa_devices/translations/et.json +4 -5
  15. homeassistant/components/alexa_devices/translations/ga.json +0 -6
  16. homeassistant/components/alexa_devices/translations/he.json +0 -4
  17. homeassistant/components/alexa_devices/translations/hu.json +0 -4
  18. homeassistant/components/alexa_devices/translations/id.json +1 -0
  19. homeassistant/components/alexa_devices/translations/lt.json +0 -4
  20. homeassistant/components/alexa_devices/translations/mk.json +12 -0
  21. homeassistant/components/alexa_devices/translations/nl.json +0 -4
  22. homeassistant/components/alexa_devices/translations/pl.json +0 -4
  23. homeassistant/components/alexa_devices/translations/pt.json +0 -4
  24. homeassistant/components/alexa_devices/translations/ru.json +4 -5
  25. homeassistant/components/alexa_devices/translations/sk.json +4 -5
  26. homeassistant/components/alexa_devices/translations/sv.json +17 -5
  27. homeassistant/components/alexa_devices/translations/tr.json +0 -4
  28. homeassistant/components/alexa_devices/translations/zh-Hans.json +15 -4
  29. homeassistant/components/alexa_devices/translations/zh-Hant.json +4 -5
  30. homeassistant/components/alexa_devices/utils.py +40 -0
  31. homeassistant/components/altruist/translations/id.json +11 -0
  32. homeassistant/components/anthropic/__init__.py +8 -1
  33. homeassistant/components/anthropic/translations/bg.json +21 -0
  34. homeassistant/components/anthropic/translations/ga.json +32 -1
  35. homeassistant/components/anthropic/translations/id.json +19 -0
  36. homeassistant/components/anthropic/translations/ru.json +30 -0
  37. homeassistant/components/buienradar/sensor.py +0 -1
  38. homeassistant/components/cambridge_audio/translations/sv.json +1 -1
  39. homeassistant/components/demo/translations/select.sv.json +2 -2
  40. homeassistant/components/derivative/translations/ga.json +20 -0
  41. homeassistant/components/derivative/translations/ru.json +3 -0
  42. homeassistant/components/devolo_home_control/translations/bg.json +6 -0
  43. homeassistant/components/devolo_home_control/translations/id.json +5 -0
  44. homeassistant/components/devolo_home_control/translations/sv.json +10 -0
  45. homeassistant/components/devolo_home_control/translations/zh-Hans.json +10 -0
  46. homeassistant/components/dlink/manifest.json +1 -1
  47. homeassistant/components/ecovacs/translations/sv.json +1 -1
  48. homeassistant/components/enphase_envoy/translations/sv.json +2 -2
  49. homeassistant/components/ezviz/translations/bg.json +6 -0
  50. homeassistant/components/ezviz/translations/mk.json +13 -0
  51. homeassistant/components/ezviz/translations/sv.json +10 -0
  52. homeassistant/components/ezviz/translations/zh-Hans.json +10 -0
  53. homeassistant/components/frontend/manifest.json +1 -1
  54. homeassistant/components/goodwe/translations/sv.json +5 -5
  55. homeassistant/components/google_generative_ai_conversation/__init__.py +15 -0
  56. homeassistant/components/google_generative_ai_conversation/config_flow.py +72 -36
  57. homeassistant/components/google_generative_ai_conversation/const.py +15 -2
  58. homeassistant/components/google_generative_ai_conversation/diagnostics.py +1 -0
  59. homeassistant/components/google_generative_ai_conversation/entity.py +7 -2
  60. homeassistant/components/google_generative_ai_conversation/helpers.py +73 -0
  61. homeassistant/components/google_generative_ai_conversation/strings.json +28 -1
  62. homeassistant/components/google_generative_ai_conversation/translations/bg.json +19 -0
  63. homeassistant/components/google_generative_ai_conversation/translations/de.json +28 -0
  64. homeassistant/components/google_generative_ai_conversation/translations/el.json +28 -0
  65. homeassistant/components/google_generative_ai_conversation/translations/en.json +28 -0
  66. homeassistant/components/google_generative_ai_conversation/translations/es.json +28 -0
  67. homeassistant/components/google_generative_ai_conversation/translations/et.json +28 -0
  68. homeassistant/components/google_generative_ai_conversation/translations/ga.json +9 -0
  69. homeassistant/components/google_generative_ai_conversation/translations/id.json +30 -0
  70. homeassistant/components/google_generative_ai_conversation/translations/mk.json +11 -0
  71. homeassistant/components/google_generative_ai_conversation/translations/ru.json +67 -0
  72. homeassistant/components/google_generative_ai_conversation/translations/sk.json +28 -0
  73. homeassistant/components/google_generative_ai_conversation/translations/sv.json +21 -0
  74. homeassistant/components/google_generative_ai_conversation/translations/zh-Hans.json +28 -0
  75. homeassistant/components/google_generative_ai_conversation/translations/zh-Hant.json +28 -0
  76. homeassistant/components/google_generative_ai_conversation/tts.py +48 -106
  77. homeassistant/components/group/translations/el.json +18 -18
  78. homeassistant/components/habitica/const.py +1 -1
  79. homeassistant/components/harmony/translations/select.sv.json +1 -1
  80. homeassistant/components/harmony/translations/sv.json +1 -1
  81. homeassistant/components/homeassistant_hardware/translations/ga.json +9 -0
  82. homeassistant/components/homeassistant_hardware/translations/mk.json +9 -0
  83. homeassistant/components/homeassistant_sky_connect/translations/ga.json +10 -0
  84. homeassistant/components/homeassistant_sky_connect/translations/mk.json +7 -0
  85. homeassistant/components/homeassistant_yellow/translations/ga.json +5 -0
  86. homeassistant/components/homewizard/translations/sv.json +3 -1
  87. homeassistant/components/http/auth.py +1 -1
  88. homeassistant/components/image/__init__.py +34 -3
  89. homeassistant/components/input_select/translations/sv.json +6 -6
  90. homeassistant/components/iron_os/translations/sv.json +1 -1
  91. homeassistant/components/keenetic_ndms2/translations/id.json +3 -0
  92. homeassistant/components/lamarzocco/translations/sv.json +3 -3
  93. homeassistant/components/lametric/translations/sv.json +2 -2
  94. homeassistant/components/lametric/update.py +1 -1
  95. homeassistant/components/lg_thinq/translations/sv.json +5 -5
  96. homeassistant/components/litterrobot/translations/bg.json +4 -0
  97. homeassistant/components/litterrobot/translations/ga.json +3 -0
  98. homeassistant/components/matter/translations/id.json +5 -0
  99. homeassistant/components/matter/vacuum.py +38 -26
  100. homeassistant/components/meater/__init__.py +5 -1
  101. homeassistant/components/meater/coordinator.py +4 -2
  102. homeassistant/components/media_source/local_source.py +21 -4
  103. homeassistant/components/mqtt/translations/bg.json +10 -0
  104. homeassistant/components/mqtt/translations/el.json +21 -0
  105. homeassistant/components/mqtt/translations/fi.json +3 -0
  106. homeassistant/components/mqtt/translations/ga.json +25 -0
  107. homeassistant/components/mqtt/translations/mk.json +23 -0
  108. homeassistant/components/mqtt/translations/ru.json +1 -0
  109. homeassistant/components/mqtt/translations/sv.json +24 -0
  110. homeassistant/components/mqtt/translations/zh-Hans.json +26 -0
  111. homeassistant/components/mqtt/translations/zh-Hant.json +19 -0
  112. homeassistant/components/music_assistant/button.py +0 -6
  113. homeassistant/components/ntfy/translations/id.json +13 -0
  114. homeassistant/components/ohme/translations/sv.json +1 -1
  115. homeassistant/components/ollama/__init__.py +2 -0
  116. homeassistant/components/ollama/const.py +2 -0
  117. homeassistant/components/ollama/translations/bg.json +19 -0
  118. homeassistant/components/ollama/translations/ga.json +31 -1
  119. homeassistant/components/ollama/translations/id.json +18 -0
  120. homeassistant/components/ollama/translations/mk.json +13 -1
  121. homeassistant/components/onewire/translations/sv.json +4 -4
  122. homeassistant/components/openai_conversation/__init__.py +2 -0
  123. homeassistant/components/openai_conversation/const.py +1 -1
  124. homeassistant/components/openai_conversation/conversation.py +1 -1
  125. homeassistant/components/openai_conversation/translations/bg.json +26 -0
  126. homeassistant/components/openai_conversation/translations/id.json +23 -0
  127. homeassistant/components/openai_conversation/translations/mk.json +44 -0
  128. homeassistant/components/playstation_network/translations/bg.json +25 -1
  129. homeassistant/components/playstation_network/translations/es.json +1 -1
  130. homeassistant/components/playstation_network/translations/ga.json +31 -0
  131. homeassistant/components/playstation_network/translations/id.json +14 -0
  132. homeassistant/components/playstation_network/translations/mk.json +18 -0
  133. homeassistant/components/playstation_network/translations/sv.json +29 -0
  134. homeassistant/components/playstation_network/translations/zh-Hans.json +29 -0
  135. homeassistant/components/qnap/translations/sv.json +1 -1
  136. homeassistant/components/remote_calendar/translations/fi.json +34 -0
  137. homeassistant/components/select/translations/sv.json +10 -10
  138. homeassistant/components/smarla/__init__.py +2 -2
  139. homeassistant/components/sonos/translations/bg.json +5 -0
  140. homeassistant/components/sonos/translations/el.json +6 -0
  141. homeassistant/components/sonos/translations/ga.json +8 -0
  142. homeassistant/components/sonos/translations/mk.json +10 -0
  143. homeassistant/components/sonos/translations/ru.json +6 -0
  144. homeassistant/components/sonos/translations/sv.json +6 -0
  145. homeassistant/components/sonos/translations/zh-Hans.json +9 -0
  146. homeassistant/components/sonos/translations/zh-Hant.json +6 -0
  147. homeassistant/components/switchbot/translations/bg.json +26 -0
  148. homeassistant/components/switchbot/translations/ga.json +33 -0
  149. homeassistant/components/switchbot/translations/id.json +19 -0
  150. homeassistant/components/switchbot/translations/mk.json +49 -0
  151. homeassistant/components/switchbot/translations/sv.json +52 -0
  152. homeassistant/components/switchbot/translations/zh-Hans.json +53 -0
  153. homeassistant/components/telegram_bot/__init__.py +20 -4
  154. homeassistant/components/telegram_bot/bot.py +33 -29
  155. homeassistant/components/telegram_bot/config_flow.py +49 -10
  156. homeassistant/components/telegram_bot/const.py +1 -1
  157. homeassistant/components/telegram_bot/strings.json +33 -10
  158. homeassistant/components/telegram_bot/translations/bg.json +0 -1
  159. homeassistant/components/telegram_bot/translations/cs.json +5 -12
  160. homeassistant/components/telegram_bot/translations/de.json +12 -11
  161. homeassistant/components/telegram_bot/translations/el.json +5 -12
  162. homeassistant/components/telegram_bot/translations/en-GB.json +5 -12
  163. homeassistant/components/telegram_bot/translations/en.json +35 -12
  164. homeassistant/components/telegram_bot/translations/es.json +5 -12
  165. homeassistant/components/telegram_bot/translations/et.json +11 -12
  166. homeassistant/components/telegram_bot/translations/fr.json +5 -12
  167. homeassistant/components/telegram_bot/translations/ga.json +5 -11
  168. homeassistant/components/telegram_bot/translations/he.json +3 -8
  169. homeassistant/components/telegram_bot/translations/hu.json +5 -12
  170. homeassistant/components/telegram_bot/translations/id.json +0 -5
  171. homeassistant/components/telegram_bot/translations/it.json +2 -5
  172. homeassistant/components/telegram_bot/translations/lt.json +5 -12
  173. homeassistant/components/telegram_bot/translations/mk.json +7 -5
  174. homeassistant/components/telegram_bot/translations/nl.json +5 -12
  175. homeassistant/components/telegram_bot/translations/pt.json +5 -12
  176. homeassistant/components/telegram_bot/translations/ru.json +12 -11
  177. homeassistant/components/telegram_bot/translations/sk.json +5 -12
  178. homeassistant/components/telegram_bot/translations/sv.json +5 -12
  179. homeassistant/components/telegram_bot/translations/tr.json +5 -12
  180. homeassistant/components/telegram_bot/translations/zh-Hans.json +5 -12
  181. homeassistant/components/telegram_bot/translations/zh-Hant.json +5 -12
  182. homeassistant/components/template/translations/sv.json +5 -5
  183. homeassistant/components/tilt_pi/translations/id.json +11 -0
  184. homeassistant/components/tts/__init__.py +15 -0
  185. homeassistant/components/unifiprotect/translations/zh-Hans.json +3 -3
  186. homeassistant/components/utility_meter/translations/sv.json +9 -9
  187. homeassistant/components/vegehub/translations/bg.json +2 -0
  188. homeassistant/components/vegehub/translations/id.json +11 -0
  189. homeassistant/components/whirlpool/translations/sv.json +12 -12
  190. homeassistant/components/zha/translations/bg.json +23 -0
  191. homeassistant/components/zha/translations/el.json +10 -0
  192. homeassistant/components/zha/translations/ga.json +20 -0
  193. homeassistant/components/zha/translations/id.json +6 -0
  194. homeassistant/components/zha/translations/sv.json +15 -0
  195. homeassistant/components/zha/translations/zh-Hans.json +50 -0
  196. homeassistant/components/zwave_js/api.py +1 -1
  197. homeassistant/components/zwave_js/config_flow.py +12 -8
  198. homeassistant/components/zwave_js/manifest.json +1 -1
  199. homeassistant/config_entries.py +6 -0
  200. homeassistant/const.py +1 -1
  201. homeassistant/package_constraints.txt +1 -1
  202. {homeassistant-2025.7.0b0.dist-info → homeassistant-2025.7.0b1.dist-info}/METADATA +1 -1
  203. {homeassistant-2025.7.0b0.dist-info → homeassistant-2025.7.0b1.dist-info}/RECORD +208 -192
  204. {homeassistant-2025.7.0b0.dist-info → homeassistant-2025.7.0b1.dist-info}/WHEEL +0 -0
  205. {homeassistant-2025.7.0b0.dist-info → homeassistant-2025.7.0b1.dist-info}/entry_points.txt +0 -0
  206. {homeassistant-2025.7.0b0.dist-info → homeassistant-2025.7.0b1.dist-info}/licenses/LICENSE.md +0 -0
  207. {homeassistant-2025.7.0b0.dist-info → homeassistant-2025.7.0b1.dist-info}/licenses/homeassistant/backports/LICENSE.Python +0 -0
  208. {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="Google Generative AI",
120
+ title=DEFAULT_TITLE,
122
121
  data=user_input,
123
122
  subentries=[
124
123
  {
125
124
  "subentry_type": "conversation",
126
- "data": RECOMMENDED_OPTIONS,
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 {"conversation": ConversationSubentryFlowHandler}
180
+ return {
181
+ "conversation": LLMSubentryFlowHandler,
182
+ "tts": LLMSubentryFlowHandler,
183
+ }
176
184
 
177
185
 
178
- class ConversationSubentryFlowHandler(ConfigSubentryFlow):
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 = RECOMMENDED_OPTIONS.copy()
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 Seearch tool with an Assist API
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=DEFAULT_CONVERSATION_NAME): str,
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" not in api_model.name
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=RECOMMENDED_CHAT_MODEL,
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
+ }
@@ -21,6 +21,7 @@ async def async_get_config_entry_diagnostics(
21
21
  "title": entry.title,
22
22
  "data": entry.data,
23
23
  "options": entry.options,
24
+ "subentries": dict(entry.subentries),
24
25
  },
25
26
  TO_REDACT,
26
27
  )
@@ -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__(self, entry: ConfigEntry, subentry: ConfigSubentry) -> None:
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="Generative AI",
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.",