From 5e82b9669c246ba2f941c8b2cd73932a164b61bd Mon Sep 17 00:00:00 2001 From: SMKRV Date: Tue, 19 Nov 2024 13:10:18 +0300 Subject: [PATCH] Release v1.0.2 --- .github/workflows/hassfest.yaml | 2 - custom_components/ha_text_ai/__init__.py | 19 +++++- custom_components/ha_text_ai/services.yaml | 31 +++------- .../ha_text_ai/translations/en.json | 57 ++++++------------ ha-text-ai.zip | Bin 9701 -> 9344 bytes hacs.json | 2 +- 6 files changed, 44 insertions(+), 67 deletions(-) diff --git a/.github/workflows/hassfest.yaml b/.github/workflows/hassfest.yaml index 694d189..5cdf1c6 100644 --- a/.github/workflows/hassfest.yaml +++ b/.github/workflows/hassfest.yaml @@ -32,8 +32,6 @@ jobs: - name: 🚀 Run hassfest validation uses: home-assistant/actions/hassfest@master - with: - strict: true - name: â„šī¸ Print hassfest version if: always() diff --git a/custom_components/ha_text_ai/__init__.py b/custom_components/ha_text_ai/__init__.py index d281dc8..5028bce 100644 --- a/custom_components/ha_text_ai/__init__.py +++ b/custom_components/ha_text_ai/__init__.py @@ -27,6 +27,23 @@ from .coordinator import HATextAICoordinator _LOGGER = logging.getLogger(__name__) + +CONFIG_SCHEMA = vol.Schema( + { + DOMAIN: vol.Schema( + { + vol.Required(CONF_API_KEY): cv.string, + vol.Optional(CONF_MODEL, default="gpt-3.5-turbo"): cv.string, + vol.Optional(CONF_TEMPERATURE, default=0.7): vol.Coerce(float), + vol.Optional(CONF_MAX_TOKENS, default=1000): vol.Coerce(int), + vol.Optional(CONF_REQUEST_INTERVAL, default=1.0): vol.Coerce(float), + vol.Optional(CONF_API_ENDPOINT): cv.string, + } + ) + }, + extra=vol.ALLOW_EXTRA, +) + async def async_setup(hass: HomeAssistant, config: dict[str, Any]) -> bool: """Set up the HA text AI component.""" hass.data.setdefault(DOMAIN, {}) @@ -39,7 +56,7 @@ async def async_setup(hass: HomeAssistant, config: dict[str, Any]) -> bool: coordinator = next(iter(hass.data[DOMAIN].values())) question = call.data["question"] - + original_params = { "model": coordinator.model, "temperature": coordinator.temperature, diff --git a/custom_components/ha_text_ai/services.yaml b/custom_components/ha_text_ai/services.yaml index 2fa11b9..7a35454 100644 --- a/custom_components/ha_text_ai/services.yaml +++ b/custom_components/ha_text_ai/services.yaml @@ -10,7 +10,6 @@ ask_question: selector: text: multiline: true - type: text model: name: Model @@ -23,20 +22,14 @@ ask_question: options: - label: "GPT-3.5 Turbo" value: "gpt-3.5-turbo" - icon: "mdi:rocket-launch" - label: "GPT-4" value: "gpt-4" - icon: "mdi:brain" - label: "GPT-4 32K" value: "gpt-4-32k" - icon: "mdi:brain-circuit" temperature: name: Temperature - description: >- - Controls response creativity (0-2): - Lower values (0-0.7) for focused, consistent responses - Higher values (0.7-2.0) for more creative, varied responses + description: "Controls response creativity (0-2): Lower values for focused responses, higher for creative ones" required: false default: 0.7 selector: @@ -45,11 +38,10 @@ ask_question: max: 2.0 step: 0.1 mode: slider - unit_of_measurement: "" max_tokens: name: Max Tokens - description: Maximum length of the response (longer responses use more tokens) + description: Maximum length of the response required: false default: 1000 selector: @@ -61,12 +53,12 @@ ask_question: clear_history: name: Clear History - description: Delete all stored questions and responses from the conversation history + description: Delete all stored questions and responses fields: {} get_history: name: Get History - description: Retrieve recent conversation history between you and the AI + description: Retrieve recent conversation history fields: limit: name: Limit @@ -82,22 +74,13 @@ get_history: set_system_prompt: name: Set System Prompt - description: >- - Configure the AI's behavior by setting a system prompt that will be used - for all future conversations until changed + description: Configure the AI's behavior by setting a system prompt fields: prompt: name: System Prompt - description: >- - Instructions that define how the AI should behave and respond. - This affects all future conversations. + description: Instructions that define how the AI should behave and respond required: true - example: >- - You are a home automation expert assistant. Provide practical advice - focused on smart home technology and automation. Use clear, concise - language and include specific product recommendations when relevant. + example: "You are a home automation expert assistant. Provide practical advice focused on smart home technology." selector: text: multiline: true - type: text - rows: 4 diff --git a/custom_components/ha_text_ai/translations/en.json b/custom_components/ha_text_ai/translations/en.json index 5087166..7245314 100644 --- a/custom_components/ha_text_ai/translations/en.json +++ b/custom_components/ha_text_ai/translations/en.json @@ -5,30 +5,12 @@ "title": "Set up HA text AI", "description": "Configure your OpenAI integration for smart home interactions", "data": { - "api_key": { - "name": "API Key", - "description": "Your OpenAI API key (starts with 'sk-')" - }, - "model": { - "name": "AI Model", - "description": "Select the AI model to use (e.g., gpt-3.5-turbo)" - }, - "temperature": { - "name": "Temperature", - "description": "Response creativity (0-2): lower for focused, higher for creative responses" - }, - "max_tokens": { - "name": "Max Tokens", - "description": "Maximum response length (1-4096 tokens)" - }, - "api_endpoint": { - "name": "API Endpoint", - "description": "OpenAI API endpoint URL (leave default if unsure)" - }, - "request_interval": { - "name": "Request Interval", - "description": "Minimum time between API requests in seconds (0.1 or higher)" - } + "api_key": "OpenAI API Key", + "model": "AI Model", + "temperature": "Temperature", + "max_tokens": "Max Tokens", + "api_endpoint": "API Endpoint", + "request_interval": "Request Interval" } } }, @@ -49,18 +31,9 @@ "title": "HA text AI Options", "description": "Adjust your OpenAI integration settings", "data": { - "temperature": { - "name": "Temperature", - "description": "Controls response creativity (0-2): lower values for focused responses, higher for more creative ones" - }, - "max_tokens": { - "name": "Max Tokens", - "description": "Maximum length of responses (1-4096 tokens)" - }, - "request_interval": { - "name": "Request Interval", - "description": "Minimum time between API requests in seconds (0.1 or higher)" - } + "temperature": "Temperature", + "max_tokens": "Max Tokens", + "request_interval": "Request Interval" } } } @@ -70,9 +43,15 @@ "last_response": { "name": "Last Response", "state_attributes": { - "question": "Last Question", - "response": "AI Response", - "last_updated": "Last Updated" + "last_updated": { + "name": "Last Updated" + }, + "question": { + "name": "Last Question" + }, + "response": { + "name": "AI Response" + } } } } diff --git a/ha-text-ai.zip b/ha-text-ai.zip index 8fc88d6825ce2bf3f13649ea27bbe817e8e8b546..5bed532b7cfaf64995022e559951a5eec67b8d85 100644 GIT binary patch delta 3479 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 delta 3751 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