From 3097106e93738f4f81b63d5542cf7c939a3ec163 Mon Sep 17 00:00:00 2001 From: SMKRV Date: Mon, 22 Dec 2025 00:07:17 +0300 Subject: [PATCH] feat: Add configurable API timeout setting - Add CONF_API_TIMEOUT configuration option (5-600 seconds, default 30) - Update config_flow.py with api_timeout field in provider form and options flow - Update api_client.py to use configurable timeout instead of hardcoded value - Update coordinator.py to use api_timeout for async_process_message - Update __init__.py to read and pass api_timeout from config - Merge entry.data with entry.options for proper options flow support - Add translations for api_timeout in all 8 language files (en, ru, de, es, it, hi, sr, zh) - Bump version to 2.2.0 Closes #8 --- custom_components/ha_text_ai/__init__.py | 33 +++++++++++-------- custom_components/ha_text_ai/api_client.py | 8 +++-- custom_components/ha_text_ai/config_flow.py | 28 ++++++++++++++++ custom_components/ha_text_ai/const.py | 10 +++++- custom_components/ha_text_ai/coordinator.py | 5 ++- custom_components/ha_text_ai/manifest.json | 2 +- .../ha_text_ai/translations/de.json | 3 ++ .../ha_text_ai/translations/en.json | 3 ++ .../ha_text_ai/translations/es.json | 3 ++ .../ha_text_ai/translations/hi.json | 3 ++ .../ha_text_ai/translations/it.json | 3 ++ .../ha_text_ai/translations/ru.json | 3 ++ .../ha_text_ai/translations/sr.json | 3 ++ .../ha_text_ai/translations/zh.json | 3 ++ 14 files changed, 90 insertions(+), 20 deletions(-) diff --git a/custom_components/ha_text_ai/__init__.py b/custom_components/ha_text_ai/__init__.py index 8872ac2..92bfb3a 100644 --- a/custom_components/ha_text_ai/__init__.py +++ b/custom_components/ha_text_ai/__init__.py @@ -35,6 +35,7 @@ from .const import ( CONF_MAX_TOKENS, CONF_API_ENDPOINT, CONF_REQUEST_INTERVAL, + CONF_API_TIMEOUT, CONF_API_PROVIDER, CONF_CONTEXT_MESSAGES, API_PROVIDER_OPENAI, @@ -51,8 +52,8 @@ from .const import ( DEFAULT_DEEPSEEK_ENDPOINT, DEFAULT_GEMINI_ENDPOINT, DEFAULT_REQUEST_INTERVAL, + DEFAULT_API_TIMEOUT, DEFAULT_CONTEXT_MESSAGES, - API_TIMEOUT, SERVICE_ASK_QUESTION, SERVICE_CLEAR_HISTORY, SERVICE_GET_HISTORY, @@ -268,7 +269,7 @@ async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool: return True -async def async_check_api(session, endpoint: str, headers: dict, provider: str) -> bool: +async def async_check_api(session, endpoint: str, headers: dict, provider: str, api_timeout: int = DEFAULT_API_TIMEOUT) -> bool: """Check API availability for different providers.""" try: if provider == API_PROVIDER_GEMINI: @@ -285,7 +286,7 @@ async def async_check_api(session, endpoint: str, headers: dict, provider: str) else: # OpenAI check_url = f"{endpoint}/models" - async with timeout(API_TIMEOUT): + async with timeout(api_timeout): async with session.get(check_url, headers=headers) as response: if response.status in [200, 404]: return True @@ -311,22 +312,24 @@ async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: _LOGGER.error("API provider not specified") raise ConfigEntryNotReady("API provider is required") - # Get configuration + # Get configuration (merge data with options to apply any runtime changes) + config = {**entry.data, **entry.options} session = aiohttp_client.async_get_clientsession(hass) - api_provider = entry.data.get(CONF_API_PROVIDER) - model = entry.data.get(CONF_MODEL, DEFAULT_MODEL) - endpoint = entry.data.get( + api_provider = config.get(CONF_API_PROVIDER) + model = config.get(CONF_MODEL, DEFAULT_MODEL) + endpoint = config.get( CONF_API_ENDPOINT, DEFAULT_OPENAI_ENDPOINT if api_provider == API_PROVIDER_OPENAI else DEFAULT_ANTHROPIC_ENDPOINT ).rstrip('/') - api_key = entry.data[CONF_API_KEY] + api_key = entry.data[CONF_API_KEY] # API key stays in data, not in options instance_name = entry.data.get(CONF_NAME, entry.entry_id) - request_interval = entry.data.get(CONF_REQUEST_INTERVAL, DEFAULT_REQUEST_INTERVAL) - max_tokens = entry.data.get(CONF_MAX_TOKENS, DEFAULT_MAX_TOKENS) - temperature = entry.data.get(CONF_TEMPERATURE, DEFAULT_TEMPERATURE) - max_history_size = entry.data.get(CONF_MAX_HISTORY_SIZE, DEFAULT_MAX_HISTORY) - context_messages = entry.data.get(CONF_CONTEXT_MESSAGES, DEFAULT_CONTEXT_MESSAGES) + request_interval = config.get(CONF_REQUEST_INTERVAL, DEFAULT_REQUEST_INTERVAL) + api_timeout = config.get(CONF_API_TIMEOUT, DEFAULT_API_TIMEOUT) + max_tokens = config.get(CONF_MAX_TOKENS, DEFAULT_MAX_TOKENS) + temperature = config.get(CONF_TEMPERATURE, DEFAULT_TEMPERATURE) + max_history_size = config.get(CONF_MAX_HISTORY_SIZE, DEFAULT_MAX_HISTORY) + context_messages = config.get(CONF_CONTEXT_MESSAGES, DEFAULT_CONTEXT_MESSAGES) is_anthropic = api_provider == API_PROVIDER_ANTHROPIC headers = { @@ -340,7 +343,7 @@ async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: else: headers["Authorization"] = f"Bearer {api_key}" - if not await async_check_api(session, endpoint, headers, api_provider): + if not await async_check_api(session, endpoint, headers, api_provider, api_timeout): raise ConfigEntryNotReady("API connection failed") _LOGGER.debug("Creating API client for %s with endpoint %s", api_provider, endpoint) @@ -351,6 +354,7 @@ async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: headers=headers, api_provider=api_provider, model=model, + api_timeout=api_timeout, ) coordinator = HATextAICoordinator( @@ -364,6 +368,7 @@ async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: max_history_size=max_history_size, context_messages=context_messages, is_anthropic=is_anthropic, + api_timeout=api_timeout, ) _LOGGER.debug(f"Created coordinator for {instance_name}") diff --git a/custom_components/ha_text_ai/api_client.py b/custom_components/ha_text_ai/api_client.py index b7f1092..0f2e5d3 100644 --- a/custom_components/ha_text_ai/api_client.py +++ b/custom_components/ha_text_ai/api_client.py @@ -16,7 +16,7 @@ from datetime import datetime, timedelta from homeassistant.core import HomeAssistant from homeassistant.exceptions import HomeAssistantError from .const import ( - API_TIMEOUT, + DEFAULT_API_TIMEOUT, API_RETRY_COUNT, API_PROVIDER_ANTHROPIC, API_PROVIDER_DEEPSEEK, @@ -41,6 +41,7 @@ class APIClient: headers: Dict[str, str], api_provider: str, model: str, + api_timeout: int = DEFAULT_API_TIMEOUT, ) -> None: """Initialize API client.""" self.session = session @@ -48,7 +49,8 @@ class APIClient: self.headers = headers self.api_provider = api_provider self.model = model - self.timeout = ClientTimeout(total=API_TIMEOUT) + self.api_timeout = api_timeout + self.timeout = ClientTimeout(total=api_timeout) self._closed = False async def __aenter__(self): @@ -93,7 +95,7 @@ class APIClient: for attempt in range(API_RETRY_COUNT): try: - async with timeout(API_TIMEOUT): + async with timeout(self.api_timeout): async with self.session.post( url, json=payload, diff --git a/custom_components/ha_text_ai/config_flow.py b/custom_components/ha_text_ai/config_flow.py index e8f53c6..e6ad02b 100644 --- a/custom_components/ha_text_ai/config_flow.py +++ b/custom_components/ha_text_ai/config_flow.py @@ -25,6 +25,7 @@ from .const import ( CONF_MAX_TOKENS, CONF_API_ENDPOINT, CONF_REQUEST_INTERVAL, + CONF_API_TIMEOUT, CONF_API_PROVIDER, CONF_CONTEXT_MESSAGES, API_PROVIDER_OPENAI, @@ -38,6 +39,7 @@ from .const import ( DEFAULT_TEMPERATURE, DEFAULT_MAX_TOKENS, DEFAULT_REQUEST_INTERVAL, + DEFAULT_API_TIMEOUT, DEFAULT_OPENAI_ENDPOINT, DEFAULT_ANTHROPIC_ENDPOINT, DEFAULT_DEEPSEEK_ENDPOINT, @@ -48,6 +50,8 @@ from .const import ( MIN_MAX_TOKENS, MAX_MAX_TOKENS, MIN_REQUEST_INTERVAL, + MIN_API_TIMEOUT, + MAX_API_TIMEOUT, DEFAULT_NAME_PREFIX, DEFAULT_MAX_HISTORY, CONF_MAX_HISTORY_SIZE, @@ -131,6 +135,10 @@ class HATextAIConfigFlow(config_entries.ConfigFlow, domain=DOMAIN): vol.Coerce(float), vol.Range(min=MIN_REQUEST_INTERVAL) ), + vol.Optional(CONF_API_TIMEOUT, default=DEFAULT_API_TIMEOUT): vol.All( + vol.Coerce(int), + vol.Range(min=MIN_API_TIMEOUT, max=MAX_API_TIMEOUT) + ), vol.Optional( CONF_CONTEXT_MESSAGES, default=DEFAULT_CONTEXT_MESSAGES @@ -182,6 +190,10 @@ class HATextAIConfigFlow(config_entries.ConfigFlow, domain=DOMAIN): vol.Coerce(float), vol.Range(min=MIN_REQUEST_INTERVAL) ), + vol.Optional(CONF_API_TIMEOUT, default=input_copy.get(CONF_API_TIMEOUT, DEFAULT_API_TIMEOUT)): vol.All( + vol.Coerce(int), + vol.Range(min=MIN_API_TIMEOUT, max=MAX_API_TIMEOUT) + ), vol.Optional( CONF_CONTEXT_MESSAGES, default=input_copy.get(CONF_CONTEXT_MESSAGES, DEFAULT_CONTEXT_MESSAGES) @@ -224,6 +236,10 @@ class HATextAIConfigFlow(config_entries.ConfigFlow, domain=DOMAIN): vol.Coerce(float), vol.Range(min=MIN_REQUEST_INTERVAL) ), + vol.Optional(CONF_API_TIMEOUT, default=input_copy.get(CONF_API_TIMEOUT, DEFAULT_API_TIMEOUT)): vol.All( + vol.Coerce(int), + vol.Range(min=MIN_API_TIMEOUT, max=MAX_API_TIMEOUT) + ), vol.Optional( CONF_CONTEXT_MESSAGES, default=input_copy.get(CONF_CONTEXT_MESSAGES, DEFAULT_CONTEXT_MESSAGES) @@ -282,6 +298,10 @@ class HATextAIConfigFlow(config_entries.ConfigFlow, domain=DOMAIN): vol.Coerce(float), vol.Range(min=MIN_REQUEST_INTERVAL) ), + vol.Optional(CONF_API_TIMEOUT, default=input_copy.get(CONF_API_TIMEOUT, DEFAULT_API_TIMEOUT)): vol.All( + vol.Coerce(int), + vol.Range(min=MIN_API_TIMEOUT, max=MAX_API_TIMEOUT) + ), vol.Optional( CONF_CONTEXT_MESSAGES, default=input_copy.get(CONF_CONTEXT_MESSAGES, DEFAULT_CONTEXT_MESSAGES) @@ -433,6 +453,7 @@ class HATextAIConfigFlow(config_entries.ConfigFlow, domain=DOMAIN): CONF_TEMPERATURE: user_input.get(CONF_TEMPERATURE, DEFAULT_TEMPERATURE), CONF_MAX_TOKENS: user_input.get(CONF_MAX_TOKENS, DEFAULT_MAX_TOKENS), CONF_REQUEST_INTERVAL: user_input.get(CONF_REQUEST_INTERVAL, DEFAULT_REQUEST_INTERVAL), + CONF_API_TIMEOUT: user_input.get(CONF_API_TIMEOUT, DEFAULT_API_TIMEOUT), CONF_CONTEXT_MESSAGES: user_input.get(CONF_CONTEXT_MESSAGES, DEFAULT_CONTEXT_MESSAGES), CONF_MAX_HISTORY_SIZE: user_input.get(CONF_MAX_HISTORY_SIZE, DEFAULT_MAX_HISTORY), } @@ -504,6 +525,13 @@ class OptionsFlowHandler(config_entries.OptionsFlow): vol.Coerce(float), vol.Range(min=MIN_REQUEST_INTERVAL) ), + vol.Optional( + CONF_API_TIMEOUT, + default=current_data.get(CONF_API_TIMEOUT, DEFAULT_API_TIMEOUT) + ): vol.All( + vol.Coerce(int), + vol.Range(min=MIN_API_TIMEOUT, max=MAX_API_TIMEOUT) + ), vol.Optional( CONF_CONTEXT_MESSAGES, default=current_data.get( diff --git a/custom_components/ha_text_ai/const.py b/custom_components/ha_text_ai/const.py index 86fb530..aee3015 100644 --- a/custom_components/ha_text_ai/const.py +++ b/custom_components/ha_text_ai/const.py @@ -61,6 +61,7 @@ CONF_TEMPERATURE: Final = "temperature" CONF_MAX_TOKENS: Final = "max_tokens" CONF_API_ENDPOINT: Final = "api_endpoint" CONF_REQUEST_INTERVAL: Final = "request_interval" +CONF_API_TIMEOUT: Final = "api_timeout" CONF_INSTANCE: Final = "instance" CONF_MAX_HISTORY_SIZE: Final = "max_history_size" # Correct constant name CONF_IS_ANTHROPIC: Final = "is_anthropic" @@ -79,6 +80,7 @@ DEFAULT_TEMPERATURE: Final = 0.1 DEFAULT_MAX_TOKENS: Final = 1000 DEFAULT_REQUEST_INTERVAL: Final = 1.0 DEFAULT_TIMEOUT: Final = 30 +DEFAULT_API_TIMEOUT: Final = 30 DEFAULT_MAX_HISTORY: Final = 50 DEFAULT_NAME: Final = "HA Text AI" DEFAULT_NAME_PREFIX = "ha_text_ai" @@ -93,9 +95,11 @@ MIN_MAX_TOKENS: Final = 1 MAX_MAX_TOKENS: Final = 100000 MIN_REQUEST_INTERVAL: Final = 0.1 MAX_REQUEST_INTERVAL: Final = 60.0 +MIN_API_TIMEOUT: Final = 5 +MAX_API_TIMEOUT: Final = 600 # API constants -API_TIMEOUT: Final = 30 +API_TIMEOUT: Final = 30 # Legacy constant, use CONF_API_TIMEOUT from config API_RETRY_COUNT: Final = 3 # Service names @@ -232,6 +236,10 @@ CONFIG_SCHEMA = vol.Schema({ vol.Coerce(float), vol.Range(min=MIN_REQUEST_INTERVAL, max=MAX_REQUEST_INTERVAL) ), + vol.Optional(CONF_API_TIMEOUT, default=DEFAULT_API_TIMEOUT): vol.All( + vol.Coerce(int), + vol.Range(min=MIN_API_TIMEOUT, max=MAX_API_TIMEOUT) + ), vol.Optional(CONF_MAX_HISTORY_SIZE, default=DEFAULT_MAX_HISTORY): vol.All( # Correct usage vol.Coerce(int), vol.Range(min=1, max=100), diff --git a/custom_components/ha_text_ai/coordinator.py b/custom_components/ha_text_ai/coordinator.py index 92e93b0..8d09977 100644 --- a/custom_components/ha_text_ai/coordinator.py +++ b/custom_components/ha_text_ai/coordinator.py @@ -37,6 +37,7 @@ from .const import ( DEFAULT_MAX_TOKENS, DEFAULT_TEMPERATURE, DEFAULT_MAX_HISTORY, + DEFAULT_API_TIMEOUT, DEFAULT_CONTEXT_MESSAGES, ABSOLUTE_MAX_HISTORY_SIZE, MAX_ATTRIBUTE_SIZE, @@ -76,6 +77,7 @@ class HATextAICoordinator(DataUpdateCoordinator): max_history_size: int = DEFAULT_MAX_HISTORY, context_messages: int = DEFAULT_CONTEXT_MESSAGES, is_anthropic: bool = False, + api_timeout: int = DEFAULT_API_TIMEOUT, ) -> None: """Initialize coordinator.""" self.instance_name = instance_name @@ -115,6 +117,7 @@ class HATextAICoordinator(DataUpdateCoordinator): ABSOLUTE_MAX_HISTORY_SIZE ) self.is_anthropic = is_anthropic + self.api_timeout = api_timeout # Initialize essential attributes self._is_processing = False @@ -916,7 +919,7 @@ class HATextAICoordinator(DataUpdateCoordinator): async def async_process_message(self, question: str, **kwargs) -> dict: """Process message using the AI client.""" try: - async with asyncio.timeout(60): # 60 second timeout + async with asyncio.timeout(self.api_timeout): if self.is_anthropic: response = await self._process_anthropic_message(question, **kwargs) else: diff --git a/custom_components/ha_text_ai/manifest.json b/custom_components/ha_text_ai/manifest.json index 5fd69b2..c98f9f6 100644 --- a/custom_components/ha_text_ai/manifest.json +++ b/custom_components/ha_text_ai/manifest.json @@ -24,6 +24,6 @@ "single_config_entry": false, "ssdp": [], "usb": [], - "version": "2.1.9", + "version": "2.2.0", "zeroconf": [] } diff --git a/custom_components/ha_text_ai/translations/de.json b/custom_components/ha_text_ai/translations/de.json index 36f3846..2b3464a 100644 --- a/custom_components/ha_text_ai/translations/de.json +++ b/custom_components/ha_text_ai/translations/de.json @@ -21,6 +21,7 @@ "temperature": "Kreativität der Antwort (0-2, niedriger = fokussierter)", "max_tokens": "Maximale Länge der Antwort (1-100000 Token)", "request_interval": "Minimale Zeit zwischen Anfragen (0,1-60 Sekunden)", + "api_timeout": "API-Anfrage Timeout in Sekunden (5-600)", "context_messages": "Anzahl der zu behaltenden Kontextnachrichten (1-20)", "max_history_size": "Maximale Größe des Gesprächsverlaufs (1-100)" } @@ -37,6 +38,7 @@ "api_endpoint": "Benutzerdefinierte API-Endpunkt-URL (optional)", "api_provider": "API-Anbieter", "request_interval": "Minimale Zeit zwischen Anfragen (0,1-60 Sekunden)", + "api_timeout": "API-Anfrage Timeout in Sekunden (5-600)", "context_messages": "Anzahl der zu behaltenden Kontextnachrichten (1-20)", "max_history_size": "Maximale Größe des Gesprächsverlaufs (1-100)" } @@ -79,6 +81,7 @@ "temperature": "Kreativität der Antwort (0-2)", "max_tokens": "Maximale Länge der Antwort (1-100000)", "request_interval": "Minimale Anfrageintervall (0,1-60 Sekunden)", + "api_timeout": "API-Anfrage Timeout in Sekunden (5-600)", "context_messages": "Anzahl der vorherigen Nachrichten, die im Kontext enthalten sein sollen (1-20)", "max_history_size": "Maximale Größe des Gesprächsverlaufs (1-100)" } diff --git a/custom_components/ha_text_ai/translations/en.json b/custom_components/ha_text_ai/translations/en.json index 3f6eb77..5bfdc49 100644 --- a/custom_components/ha_text_ai/translations/en.json +++ b/custom_components/ha_text_ai/translations/en.json @@ -21,6 +21,7 @@ "temperature": "Response creativity (0-2, lower = more focused)", "max_tokens": "Maximum response length (1-100000 tokens)", "request_interval": "Minimum time between requests (0.1-60 seconds)", + "api_timeout": "API request timeout in seconds (5-600)", "context_messages": "Number of context messages to retain (1-20)", "max_history_size": "Maximum conversation history size (1-100)" } @@ -37,6 +38,7 @@ "api_endpoint": "Custom API endpoint URL (optional)", "api_provider": "API Provider", "request_interval": "Minimum time between requests (0.1-60 seconds)", + "api_timeout": "API request timeout in seconds (5-600)", "context_messages": "Number of context messages to retain (1-20)", "max_history_size": "Maximum conversation history size (1-100)" } @@ -79,6 +81,7 @@ "temperature": "Response creativity (0-2)", "max_tokens": "Maximum response length (1-100000)", "request_interval": "Minimum request interval (0.1-60 seconds)", + "api_timeout": "API request timeout in seconds (5-600)", "context_messages": "Number of previous messages to include in context (1-20)", "max_history_size": "Maximum conversation history size (1-100)" } diff --git a/custom_components/ha_text_ai/translations/es.json b/custom_components/ha_text_ai/translations/es.json index 40a6e70..4ba2a8b 100644 --- a/custom_components/ha_text_ai/translations/es.json +++ b/custom_components/ha_text_ai/translations/es.json @@ -21,6 +21,7 @@ "temperature": "Creatividad de la respuesta (0-2, menor = más enfocado)", "max_tokens": "Longitud máxima de la respuesta (1-100000 tokens)", "request_interval": "Tiempo mínimo entre solicitudes (0.1-60 segundos)", + "api_timeout": "Tiempo de espera de solicitud API en segundos (5-600)", "context_messages": "Número de mensajes de contexto a retener (1-20)", "max_history_size": "Tamaño máximo del historial de conversación (1-100)" } @@ -37,6 +38,7 @@ "api_endpoint": "URL del endpoint de API personalizado (opcional)", "api_provider": "Proveedor de API", "request_interval": "Tiempo mínimo entre solicitudes (0.1-60 segundos)", + "api_timeout": "Tiempo de espera de solicitud API en segundos (5-600)", "context_messages": "Número de mensajes de contexto a retener (1-20)", "max_history_size": "Tamaño máximo del historial de conversación (1-100)" } @@ -79,6 +81,7 @@ "temperature": "Creatividad de la respuesta (0-2)", "max_tokens": "Longitud máxima de la respuesta (1-100000)", "request_interval": "Intervalo mínimo de solicitud (0.1-60 segundos)", + "api_timeout": "Tiempo de espera de solicitud API en segundos (5-600)", "context_messages": "Número de mensajes anteriores a incluir en el contexto (1-20)", "max_history_size": "Tamaño máximo del historial de conversación (1-100)" } diff --git a/custom_components/ha_text_ai/translations/hi.json b/custom_components/ha_text_ai/translations/hi.json index 43bfccd..bcf5ac1 100644 --- a/custom_components/ha_text_ai/translations/hi.json +++ b/custom_components/ha_text_ai/translations/hi.json @@ -12,6 +12,7 @@ "temperature": "प्रतिक्रिया की रचनात्मकता (0-2, कम = अधिक केंद्रित)", "max_tokens": "प्रतिक्रिया की अधिकतम लंबाई (1-100000 टोकन)", "request_interval": "अनुरोधों के बीच न्यूनतम समय (0.1-60 सेकंड)", + "api_timeout": "एपीआई अनुरोध टाइमआउट सेकंड में (5-600)", "context_messages": "रखने के लिए संदर्भ संदेशों की संख्या (1-20)", "max_history_size": "अधिकतम बातचीत इतिहास आकार (1-100)" } @@ -28,6 +29,7 @@ "api_endpoint": "कस्टम एपीआई एंडपॉइंट यूआरएल (वैकल्पिक)", "api_provider": "एपीआई प्रदाता", "request_interval": "अनुरोधों के बीच न्यूनतम समय (0.1-60 सेकंड)", + "api_timeout": "एपीआई अनुरोध टाइमआउट सेकंड में (5-600)", "context_messages": "रखने के लिए संदर्भ संदेशों की संख्या (1-20)", "max_history_size": "अधिकतम बातचीत इतिहास आकार (1-100)" } @@ -70,6 +72,7 @@ "temperature": "प्रतिक्रिया की रचनात्मकता (0-2)", "max_tokens": "प्रतिक्रिया की अधिकतम लंबाई (1-100000)", "request_interval": "न्यूनतम अनुरोध अंतराल (0.1-60 सेकंड)", + "api_timeout": "एपीआई अनुरोध टाइमआउट सेकंड में (5-600)", "context_messages": "संदर्भ में शामिल करने के लिए पिछले संदेशों की संख्या (1-20)", "max_history_size": "अधिकतम बातचीत इतिहास आकार (1-100)" } diff --git a/custom_components/ha_text_ai/translations/it.json b/custom_components/ha_text_ai/translations/it.json index 5e84cdc..73715ed 100644 --- a/custom_components/ha_text_ai/translations/it.json +++ b/custom_components/ha_text_ai/translations/it.json @@ -21,6 +21,7 @@ "temperature": "Creatività della risposta (0-2, più basso = più focalizzato)", "max_tokens": "Lunghezza massima della risposta (1-100000 token)", "request_interval": "Tempo minimo tra le richieste (0.1-60 secondi)", + "api_timeout": "Timeout della richiesta API in secondi (5-600)", "context_messages": "Numero di messaggi di contesto da mantenere (1-20)", "max_history_size": "Dimensione massima della cronologia delle conversazioni (1-100)" } @@ -37,6 +38,7 @@ "api_endpoint": "URL dell'endpoint API personalizzato (opzionale)", "api_provider": "Fornitore API", "request_interval": "Tempo minimo tra le richieste (0.1-60 secondi)", + "api_timeout": "Timeout della richiesta API in secondi (5-600)", "context_messages": "Numero di messaggi di contesto da mantenere (1-20)", "max_history_size": "Dimensione massima della cronologia delle conversazioni (1-100)" } @@ -79,6 +81,7 @@ "temperature": "Creatività della risposta (0-2)", "max_tokens": "Lunghezza massima della risposta (1-100000)", "request_interval": "Intervallo minimo di richiesta (0.1-60 secondi)", + "api_timeout": "Timeout della richiesta API in secondi (5-600)", "context_messages": "Numero di messaggi precedenti da includere nel contesto (1-20)", "max_history_size": "Dimensione massima della cronologia delle conversazioni (1-100)" } diff --git a/custom_components/ha_text_ai/translations/ru.json b/custom_components/ha_text_ai/translations/ru.json index d0e95b1..9406ece 100644 --- a/custom_components/ha_text_ai/translations/ru.json +++ b/custom_components/ha_text_ai/translations/ru.json @@ -21,6 +21,7 @@ "temperature": "Креативность ответа (0-2, меньше = более сфокусированно)", "max_tokens": "Максимальная длина ответа (1-100000 токенов)", "request_interval": "Минимальный интервал между запросами (0.1-60 секунд)", + "api_timeout": "Таймаут API-запроса в секундах (5-600)", "context_messages": "Количество сохраняемых контекстных сообщений (1-20)", "max_history_size": "Максимальный размер истории разговора (1-100)" } @@ -37,6 +38,7 @@ "api_endpoint": "Пользовательский URL-адрес конечной точки API (необязательно)", "api_provider": "Провайдер API", "request_interval": "Минимальный интервал между запросами (0.1-60 секунд)", + "api_timeout": "Таймаут API-запроса в секундах (5-600)", "context_messages": "Количество сохраняемых контекстных сообщений (1-20)", "max_history_size": "Максимальный размер истории разговора (1-100)" } @@ -79,6 +81,7 @@ "temperature": "Креативность ответа (0-2)", "max_tokens": "Максимальная длина ответа (1-100000)", "request_interval": "Минимальный интервал между запросами (0.1-60 секунд)", + "api_timeout": "Таймаут API-запроса в секундах (5-600)", "context_messages": "Количество предыдущих сообщений для включения в контекст (1-20)", "max_history_size": "Максимальный размер истории разговора (1-100)" } diff --git a/custom_components/ha_text_ai/translations/sr.json b/custom_components/ha_text_ai/translations/sr.json index fc543fa..f24695b 100644 --- a/custom_components/ha_text_ai/translations/sr.json +++ b/custom_components/ha_text_ai/translations/sr.json @@ -12,6 +12,7 @@ "temperature": "Креативност одговора (0-2, нижа = фокусираније)", "max_tokens": "Максимална дужина одговора (1-100000 токена)", "request_interval": "Минимално време између захтева (0.1-60 секунди)", + "api_timeout": "Временско ограничење API захтева у секундама (5-600)", "context_messages": "Број контекстуалних порука које треба задржати (1-20)", "max_history_size": "Максимална величина историје разговора (1-100)" } @@ -28,6 +29,7 @@ "api_endpoint": "Прилагођени URL API крајње тачке (опционо)", "api_provider": "API провајдер", "request_interval": "Минимално време између захтева (0.1-60 секунди)", + "api_timeout": "Временско ограничење API захтева у секундама (5-600)", "context_messages": "Број контекстуалних порука које треба задржати (1-20)", "max_history_size": "Максимална величина историје разговора (1-100)" } @@ -70,6 +72,7 @@ "temperature": "Креативност одговора (0-2)", "max_tokens": "Максимална дужина одговора (1-100000)", "request_interval": "Минимално време између захтева (0.1-60 секунди)", + "api_timeout": "Временско ограничење API захтева у секундама (5-600)", "context_messages": "Број претходних порука које треба укључити у контекст (1-20)", "max_history_size": "Максимална величина историје разговора (1-100)" } diff --git a/custom_components/ha_text_ai/translations/zh.json b/custom_components/ha_text_ai/translations/zh.json index 4c99434..537d6ae 100644 --- a/custom_components/ha_text_ai/translations/zh.json +++ b/custom_components/ha_text_ai/translations/zh.json @@ -12,6 +12,7 @@ "temperature": "响应创造力(0-2,越低越专注)", "max_tokens": "最大响应长度(1-100000个标记)", "request_interval": "请求之间的最小时间(0.1-60秒)", + "api_timeout": "API请求超时时间(5-600秒)", "context_messages": "保留的上下文消息数量(1-20)", "max_history_size": "最大对话历史大小(1-100)" } @@ -28,6 +29,7 @@ "api_endpoint": "自定义API端点URL(可选)", "api_provider": "API提供者", "request_interval": "请求之间的最小时间(0.1-60秒)", + "api_timeout": "API请求超时时间(5-600秒)", "context_messages": "保留的上下文消息数量(1-20)", "max_history_size": "最大对话历史大小(1-100)" } @@ -70,6 +72,7 @@ "temperature": "响应创造力(0-2)", "max_tokens": "最大响应长度(1-100000)", "request_interval": "最小请求间隔(0.1-60秒)", + "api_timeout": "API请求超时时间(5-600秒)", "context_messages": "要包含在上下文中的先前消息数量(1-20)", "max_history_size": "最大对话历史大小(1-100)" }