diff --git a/custom_components/ha_text_ai/config_flow.py b/custom_components/ha_text_ai/config_flow.py index d23d0e6..195e4ee 100644 --- a/custom_components/ha_text_ai/config_flow.py +++ b/custom_components/ha_text_ai/config_flow.py @@ -40,29 +40,22 @@ STEP_USER_DATA_SCHEMA = vol.Schema({ default=DEFAULT_TEMPERATURE ): vol.All( vol.Coerce(float), - vol.Range(min=0, max=2), - msg="Temperature must be between 0 and 2" + vol.Range(min=0, max=2) ), vol.Optional( CONF_MAX_TOKENS, default=DEFAULT_MAX_TOKENS ): vol.All( vol.Coerce(int), - vol.Range(min=1, max=4096), - msg="Max tokens must be between 1 and 4096" - ), - vol.Optional(CONF_API_ENDPOINT, default=DEFAULT_API_ENDPOINT): vol.All( - str, - vol.Url(), # Заменено с URL на Url - msg="Must be a valid URL" + vol.Range(min=1, max=4096) ), + vol.Optional(CONF_API_ENDPOINT, default=DEFAULT_API_ENDPOINT): str, vol.Optional( CONF_REQUEST_INTERVAL, default=DEFAULT_REQUEST_INTERVAL ): vol.All( vol.Coerce(float), - vol.Range(min=0.1), - msg="Request interval must be at least 0.1 seconds" + vol.Range(min=0.1) ), }) @@ -172,12 +165,32 @@ class HATextAIConfigFlow(config_entries.ConfigFlow, domain=DOMAIN): if user_input is not None: try: + # Validate URL format + endpoint = user_input.get(CONF_API_ENDPOINT, DEFAULT_API_ENDPOINT) + try: + result = urlparse(endpoint) + if not all([result.scheme, result.netloc]): + errors["base"] = "invalid_url_format" + return self.async_show_form( + step_id="user", + data_schema=STEP_USER_DATA_SCHEMA, + errors=errors + ) + except Exception as e: + _LOGGER.error("URL parsing error: %s", str(e)) + errors["base"] = "invalid_url_format" + return self.async_show_form( + step_id="user", + data_schema=STEP_USER_DATA_SCHEMA, + errors=errors + ) + # Validate input data user_input = STEP_USER_DATA_SCHEMA(user_input) is_valid, error_code, available_models = await validate_api_connection( user_input[CONF_API_KEY], - user_input.get(CONF_API_ENDPOINT, DEFAULT_API_ENDPOINT), + endpoint, user_input[CONF_MODEL] ) @@ -244,8 +257,7 @@ class OptionsFlowHandler(config_entries.OptionsFlow): description={"suggested_value": DEFAULT_TEMPERATURE}, ): vol.All( vol.Coerce(float), - vol.Range(min=0, max=2), - msg="Temperature must be between 0 and 2" + vol.Range(min=0, max=2) ), vol.Optional( CONF_MAX_TOKENS, @@ -255,8 +267,7 @@ class OptionsFlowHandler(config_entries.OptionsFlow): description={"suggested_value": DEFAULT_MAX_TOKENS}, ): vol.All( vol.Coerce(int), - vol.Range(min=1, max=4096), - msg="Max tokens must be between 1 and 4096" + vol.Range(min=1, max=4096) ), vol.Optional( CONF_REQUEST_INTERVAL, @@ -266,8 +277,7 @@ class OptionsFlowHandler(config_entries.OptionsFlow): description={"suggested_value": DEFAULT_REQUEST_INTERVAL}, ): vol.All( vol.Coerce(float), - vol.Range(min=0.1), - msg="Request interval must be at least 0.1 seconds" + vol.Range(min=0.1) ), }) diff --git a/custom_components/ha_text_ai/translations/ru.json b/custom_components/ha_text_ai/translations/ru.json index 84c8d86..4f4c9dc 100644 --- a/custom_components/ha_text_ai/translations/ru.json +++ b/custom_components/ha_text_ai/translations/ru.json @@ -28,6 +28,7 @@ "request_interval": { "name": "Интервал запросов", "description": "Минимальное время между API запросами в секундах. Увеличьте при превышении лимитов запросов." + } } } } @@ -42,7 +43,13 @@ "context_length": "Входные данные слишком длинные для выбранной модели. Уменьшите max_tokens или используйте модель с большим контекстом.", "api_error": "Ошибка API OpenAI. Проверьте логи для подробностей.", "timeout": "Превышено время ожидания ответа от API.", - "queue_full": "Очередь запросов переполнена. Попробуйте позже." + "queue_full": "Очередь запросов переполнена. Попробуйте позже.", + "invalid_url_format": "Неверный формат URL", + "invalid_input": "Неверные входные данные", + "invalid_temperature": "Температура должна быть от 0 до 2", + "invalid_max_tokens": "Максимальное количество токенов должно быть от 1 до 4096", + "invalid_request_interval": "Интервал запросов должен быть не менее 0.1 секунды", + "unknown": "Неизвестная ошибка" }, "abort": { "already_configured": "Эта интеграция OpenAI уже настроена", diff --git a/ha_text_ai.zip b/ha_text_ai.zip index 965c94c..d8a1452 100644 Binary files a/ha_text_ai.zip and b/ha_text_ai.zip differ