From 24dc4ac4d4fda35eef22665f21cff7a9b727a424 Mon Sep 17 00:00:00 2001 From: SMKRV Date: Tue, 19 Nov 2024 16:53:27 +0300 Subject: [PATCH] Hotfix --- custom_components/ha_text_ai/services.yaml | 18 +-- .../ha_text_ai/translations/en.json | 106 +++++++++++----- .../ha_text_ai/translations/ru.json | 120 ++++++++++++------ ha_text_ai.zip | Bin 16972 -> 14151 bytes 4 files changed, 154 insertions(+), 90 deletions(-) diff --git a/custom_components/ha_text_ai/services.yaml b/custom_components/ha_text_ai/services.yaml index eea43fd..f97d82b 100644 --- a/custom_components/ha_text_ai/services.yaml +++ b/custom_components/ha_text_ai/services.yaml @@ -131,12 +131,7 @@ get_history: mode: dropdown set_system_prompt: - name: Set System Prompt - description: >- - Configure the AI's behavior by setting a system prompt. - This affects how the AI interprets and responds to all future questions. - The prompt will persist until changed or cleared. - fields: + fields: prompt: name: System Prompt description: >- @@ -157,14 +152,3 @@ set_system_prompt: text: multiline: true type: text - max_length: 1000 - - clear_prompt: - name: Clear Existing Prompt - description: >- - Set to true to remove the current system prompt before applying the new one. - This ensures no conflicting instructions remain. - required: false - default: false - selector: - boolean: {} diff --git a/custom_components/ha_text_ai/translations/en.json b/custom_components/ha_text_ai/translations/en.json index b64ace3..83740f4 100644 --- a/custom_components/ha_text_ai/translations/en.json +++ b/custom_components/ha_text_ai/translations/en.json @@ -1,36 +1,82 @@ { "config": { - "option": { - "api_key": { - "name": "API Key", - "description": "Your OpenAI API key" - }, - "model": { - "name": "Model", - "description": "AI model to use for responses" - }, - "temperature": { - "name": "Temperature", - "description": "Temperature for response generation (0-2)" - }, - "max_tokens": { - "name": "Max Tokens", - "description": "Maximum tokens in response (1-4096)" - }, - "api_endpoint": { - "name": "API Endpoint", - "description": "API endpoint URL" - }, - "request_interval": { - "name": "Request Interval", - "description": "Minimum time between API requests (seconds)" + "step": { + "user": { + "title": "Set up HA Text AI", + "description": "Configure your OpenAI integration", + "data": { + "api_key": { + "name": "API Key", + "description": "Your OpenAI API key" + }, + "model": { + "name": "Model", + "description": "AI model to use for responses" + }, + "temperature": { + "name": "Temperature", + "description": "Temperature for response generation (0-2)" + }, + "max_tokens": { + "name": "Max Tokens", + "description": "Maximum tokens in response (1-4096)" + }, + "api_endpoint": { + "name": "API Endpoint", + "description": "API endpoint URL" + }, + "request_interval": { + "name": "Request Interval", + "description": "Minimum time between API requests (seconds)" + } + } } } }, "options": { - "temperature": "Temperature", - "max_tokens": "Max Tokens", - "request_interval": "Request Interval" + "step": { + "init": { + "title": "HA Text AI Options", + "data": { + "temperature": { + "name": "Temperature", + "description": "Response temperature (0-2)" + }, + "max_tokens": { + "name": "Max Tokens", + "description": "Maximum response length" + }, + "request_interval": { + "name": "Request Interval", + "description": "Time between requests" + } + } + } + } + }, + "services": { + "ask_question": { + "name": "Ask Question", + "description": "Send a question to the AI model", + "fields": { + "question": { + "name": "Question", + "description": "Your question for the AI" + } + } + }, + "clear_history": { + "name": "Clear History", + "description": "Clear conversation history" + }, + "get_history": { + "name": "Get History", + "description": "Retrieve conversation history" + }, + "set_system_prompt": { + "name": "Set System Prompt", + "description": "Set system behavior instructions" + } }, "error": { "invalid_api_key": "Invalid API key", @@ -51,11 +97,5 @@ "disconnected": "Disconnected", "rate_limited": "Rate limited", "initializing": "Initializing" - }, - "services": { - "ask_question": "Ask Question", - "clear_history": "Clear History", - "get_history": "Get History", - "set_system_prompt": "Set System Prompt" } } diff --git a/custom_components/ha_text_ai/translations/ru.json b/custom_components/ha_text_ai/translations/ru.json index 9876f2d..009bed8 100644 --- a/custom_components/ha_text_ai/translations/ru.json +++ b/custom_components/ha_text_ai/translations/ru.json @@ -1,61 +1,101 @@ { "config": { - "option": { - "api_key": { - "name": "API ключ", - "description": "Ваш API ключ OpenAI" - }, - "model": { - "name": "Модель", - "description": "Модель AI для генерации ответов" - }, - "temperature": { - "name": "Температура", - "description": "Температура для генерации ответов (0-2)" - }, - "max_tokens": { - "name": "Максимальное количество токенов", - "description": "Максимальное количество токенов в ответе (1-4096)" - }, - "api_endpoint": { - "name": "Конечная точка API", - "description": "URL конечной точки API" - }, - "request_interval": { - "name": "Интервал запросов", - "description": "Минимальное время между запросами к API в секундах" + "step": { + "user": { + "title": "Настройка HA Text AI", + "description": "Настройка интеграции с OpenAI", + "data": { + "api_key": { + "name": "API Ключ", + "description": "Ваш ключ API OpenAI" + }, + "model": { + "name": "Модель", + "description": "Модель ИИ для генерации ответов" + }, + "temperature": { + "name": "Температура", + "description": "Температура генерации ответов (0-2)" + }, + "max_tokens": { + "name": "Макс. токенов", + "description": "Максимальное количество токенов в ответе (1-4096)" + }, + "api_endpoint": { + "name": "API Endpoint", + "description": "URL конечной точки API" + }, + "request_interval": { + "name": "Интервал запросов", + "description": "Минимальное время между запросами к API (секунды)" + } + } } } }, "options": { - "temperature": "Температура", - "max_tokens": "Максимальное количество токенов", - "request_interval": "Интервал запросов" + "step": { + "init": { + "title": "Настройки HA Text AI", + "data": { + "temperature": { + "name": "Температура", + "description": "Температура ответов (0-2)" + }, + "max_tokens": { + "name": "Макс. токенов", + "description": "Максимальная длина ответа" + }, + "request_interval": { + "name": "Интервал запросов", + "description": "Время между запросами" + } + } + } + } + }, + "services": { + "ask_question": { + "name": "Задать вопрос", + "description": "Отправить вопрос модели ИИ", + "fields": { + "question": { + "name": "Вопрос", + "description": "Ваш вопрос для ИИ" + } + } + }, + "clear_history": { + "name": "Очистить историю", + "description": "Очистить историю разговора" + }, + "get_history": { + "name": "Получить историю", + "description": "Получить историю разговора" + }, + "set_system_prompt": { + "name": "Установить системный промпт", + "description": "Установить инструкции поведения системы" + } }, "error": { - "invalid_api_key": "Неверный API ключ", + "invalid_api_key": "Недействительный API ключ", "cannot_connect": "Не удается подключиться к API", "unknown_error": "Неизвестная ошибка", - "invalid_model": "Неверная модель", + "invalid_model": "Недопустимая модель", "rate_limit_exceeded": "Превышен лимит запросов", "context_length_exceeded": "Превышена длина контекста", "api_error": "Ошибка API", - "timeout_error": "Время ожидания истекло", - "queue_full": "Очередь полна", - "invalid_prompt": "Неверный запрос" + "timeout_error": "Ошибка тайм-аута", + "queue_full": "Очередь заполнена", + "invalid_prompt": "Недопустимый промпт" }, "state": { - "ready": "Готово", + "ready": "Готов", "processing": "Обработка", "error": "Ошибка", "disconnected": "Отключено", - "rate_limited": "Ограниченный по скорости", + "rate_limited": "Превышен лимит", "initializing": "Инициализация" - }, - "services": { - "ask_question": "Задать вопрос", - "clear_history": "Очистить историю", - "get_history": "Получить историю", - "set_system_prompt": "Установить системный запрос" } } diff --git a/ha_text_ai.zip b/ha_text_ai.zip index d8a1452e6f46439e3811e4c8d5a6d7656bb7531f..285508cb80ae24ffbaf1fa9945d7b117e2009e82 100644 GIT binary patch delta 7898 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 MobYE{|M^@01GLuh2mk;8 delta 10746 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 I_#emgKT7;V)Bpeg