mirror of
https://github.com/smkrv/ha-text-ai.git
synced 2026-07-23 23:54:02 +08:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
30aa894634 | ||
|
|
398b2550a9 |
@@ -40,29 +40,22 @@ STEP_USER_DATA_SCHEMA = vol.Schema({
|
|||||||
default=DEFAULT_TEMPERATURE
|
default=DEFAULT_TEMPERATURE
|
||||||
): vol.All(
|
): vol.All(
|
||||||
vol.Coerce(float),
|
vol.Coerce(float),
|
||||||
vol.Range(min=0, max=2),
|
vol.Range(min=0, max=2)
|
||||||
msg="Temperature must be between 0 and 2"
|
|
||||||
),
|
),
|
||||||
vol.Optional(
|
vol.Optional(
|
||||||
CONF_MAX_TOKENS,
|
CONF_MAX_TOKENS,
|
||||||
default=DEFAULT_MAX_TOKENS
|
default=DEFAULT_MAX_TOKENS
|
||||||
): vol.All(
|
): vol.All(
|
||||||
vol.Coerce(int),
|
vol.Coerce(int),
|
||||||
vol.Range(min=1, max=4096),
|
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(),
|
|
||||||
msg="Must be a valid URL"
|
|
||||||
),
|
),
|
||||||
|
vol.Optional(CONF_API_ENDPOINT, default=DEFAULT_API_ENDPOINT): str,
|
||||||
vol.Optional(
|
vol.Optional(
|
||||||
CONF_REQUEST_INTERVAL,
|
CONF_REQUEST_INTERVAL,
|
||||||
default=DEFAULT_REQUEST_INTERVAL
|
default=DEFAULT_REQUEST_INTERVAL
|
||||||
): vol.All(
|
): vol.All(
|
||||||
vol.Coerce(float),
|
vol.Coerce(float),
|
||||||
vol.Range(min=0.1),
|
vol.Range(min=0.1)
|
||||||
msg="Request interval must be at least 0.1 seconds"
|
|
||||||
),
|
),
|
||||||
})
|
})
|
||||||
|
|
||||||
@@ -172,12 +165,32 @@ class HATextAIConfigFlow(config_entries.ConfigFlow, domain=DOMAIN):
|
|||||||
|
|
||||||
if user_input is not None:
|
if user_input is not None:
|
||||||
try:
|
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
|
# Validate input data
|
||||||
user_input = STEP_USER_DATA_SCHEMA(user_input)
|
user_input = STEP_USER_DATA_SCHEMA(user_input)
|
||||||
|
|
||||||
is_valid, error_code, available_models = await validate_api_connection(
|
is_valid, error_code, available_models = await validate_api_connection(
|
||||||
user_input[CONF_API_KEY],
|
user_input[CONF_API_KEY],
|
||||||
user_input.get(CONF_API_ENDPOINT, DEFAULT_API_ENDPOINT),
|
endpoint,
|
||||||
user_input[CONF_MODEL]
|
user_input[CONF_MODEL]
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -244,8 +257,7 @@ class OptionsFlowHandler(config_entries.OptionsFlow):
|
|||||||
description={"suggested_value": DEFAULT_TEMPERATURE},
|
description={"suggested_value": DEFAULT_TEMPERATURE},
|
||||||
): vol.All(
|
): vol.All(
|
||||||
vol.Coerce(float),
|
vol.Coerce(float),
|
||||||
vol.Range(min=0, max=2),
|
vol.Range(min=0, max=2)
|
||||||
msg="Temperature must be between 0 and 2"
|
|
||||||
),
|
),
|
||||||
vol.Optional(
|
vol.Optional(
|
||||||
CONF_MAX_TOKENS,
|
CONF_MAX_TOKENS,
|
||||||
@@ -255,8 +267,7 @@ class OptionsFlowHandler(config_entries.OptionsFlow):
|
|||||||
description={"suggested_value": DEFAULT_MAX_TOKENS},
|
description={"suggested_value": DEFAULT_MAX_TOKENS},
|
||||||
): vol.All(
|
): vol.All(
|
||||||
vol.Coerce(int),
|
vol.Coerce(int),
|
||||||
vol.Range(min=1, max=4096),
|
vol.Range(min=1, max=4096)
|
||||||
msg="Max tokens must be between 1 and 4096"
|
|
||||||
),
|
),
|
||||||
vol.Optional(
|
vol.Optional(
|
||||||
CONF_REQUEST_INTERVAL,
|
CONF_REQUEST_INTERVAL,
|
||||||
@@ -266,8 +277,7 @@ class OptionsFlowHandler(config_entries.OptionsFlow):
|
|||||||
description={"suggested_value": DEFAULT_REQUEST_INTERVAL},
|
description={"suggested_value": DEFAULT_REQUEST_INTERVAL},
|
||||||
): vol.All(
|
): vol.All(
|
||||||
vol.Coerce(float),
|
vol.Coerce(float),
|
||||||
vol.Range(min=0.1),
|
vol.Range(min=0.1)
|
||||||
msg="Request interval must be at least 0.1 seconds"
|
|
||||||
),
|
),
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|||||||
@@ -9,6 +9,6 @@
|
|||||||
"issue_tracker": "https://github.com/smkrv/ha-text-ai/issues",
|
"issue_tracker": "https://github.com/smkrv/ha-text-ai/issues",
|
||||||
"requirements": ["openai>=1.0.0"],
|
"requirements": ["openai>=1.0.0"],
|
||||||
"ssdp": [],
|
"ssdp": [],
|
||||||
"version": "1.0.4",
|
"version": "1.0.5",
|
||||||
"zeroconf": []
|
"zeroconf": []
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -28,6 +28,7 @@
|
|||||||
"request_interval": {
|
"request_interval": {
|
||||||
"name": "Интервал запросов",
|
"name": "Интервал запросов",
|
||||||
"description": "Минимальное время между API запросами в секундах. Увеличьте при превышении лимитов запросов."
|
"description": "Минимальное время между API запросами в секундах. Увеличьте при превышении лимитов запросов."
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -42,7 +43,13 @@
|
|||||||
"context_length": "Входные данные слишком длинные для выбранной модели. Уменьшите max_tokens или используйте модель с большим контекстом.",
|
"context_length": "Входные данные слишком длинные для выбранной модели. Уменьшите max_tokens или используйте модель с большим контекстом.",
|
||||||
"api_error": "Ошибка API OpenAI. Проверьте логи для подробностей.",
|
"api_error": "Ошибка API OpenAI. Проверьте логи для подробностей.",
|
||||||
"timeout": "Превышено время ожидания ответа от API.",
|
"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": {
|
"abort": {
|
||||||
"already_configured": "Эта интеграция OpenAI уже настроена",
|
"already_configured": "Эта интеграция OpenAI уже настроена",
|
||||||
|
|||||||
Binary file not shown.
@@ -4,6 +4,6 @@
|
|||||||
"domains": ["sensor"],
|
"domains": ["sensor"],
|
||||||
"homeassistant": "2024.11.0",
|
"homeassistant": "2024.11.0",
|
||||||
"icon": "mdi:brain",
|
"icon": "mdi:brain",
|
||||||
"version": "1.0.4",
|
"version": "1.0.5",
|
||||||
"documentation": "https://github.com/smkrv/ha-text-ai"
|
"documentation": "https://github.com/smkrv/ha-text-ai"
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user