diff --git a/README.md b/README.md index 103e1b9..fc11eef 100644 --- a/README.md +++ b/README.md @@ -108,6 +108,7 @@ Transform your smart home experience with powerful AI assistance powered by mult - Active API key from: - OpenAI ([Get key](https://platform.openai.com/account/api-keys)) - Anthropic ([Get key](https://console.anthropic.com/)) + - DeepSeek 🆕 ([Get key](https://platform.deepseek.com/api_keys)) - OpenRouter ([Get key](https://openrouter.ai/keys)) - Any OpenAI-compatible API provider - Python 3.9 or newer @@ -120,7 +121,7 @@ Transform your smart home experience with powerful AI assistance powered by mult - 🔑 **API Key**: Provider-specific authentication - 🤖 **Model Selection**: Flexible, provider-specific models - 🌡️ **Temperature**: Creativity control (0.0-2.0) -- 📏 **Max Tokens**: Response length limit (token usage is estimated using a heuristic method based on word count and specific word characteristics, which may differ from actual token usage) +- 📏 **Max Tokens**: Response length limit (passed directly to the LLM API to control the maximum length of the response) - ⏱️ **Request Interval**: API call throttling - 💾 **History Size**: Number of messages to retain - 🌍 **Custom API Endpoint**: Optional advanced configuration diff --git a/custom_components/ha_text_ai/__init__.py b/custom_components/ha_text_ai/__init__.py index ef824f7..40da9c8 100644 --- a/custom_components/ha_text_ai/__init__.py +++ b/custom_components/ha_text_ai/__init__.py @@ -39,11 +39,14 @@ from .const import ( CONF_CONTEXT_MESSAGES, API_PROVIDER_OPENAI, API_PROVIDER_ANTHROPIC, + API_PROVIDER_DEEPSEEK, DEFAULT_MODEL, + DEFAULT_DEEPSEEK_MODEL, DEFAULT_TEMPERATURE, DEFAULT_MAX_TOKENS, DEFAULT_OPENAI_ENDPOINT, DEFAULT_ANTHROPIC_ENDPOINT, + DEFAULT_DEEPSEEK_ENDPOINT, DEFAULT_REQUEST_INTERVAL, DEFAULT_CONTEXT_MESSAGES, API_TIMEOUT, @@ -235,6 +238,8 @@ async def async_check_api(session, endpoint: str, headers: dict, provider: str) try: if provider == API_PROVIDER_ANTHROPIC: check_url = f"{endpoint}/v1/models" + elif provider == API_PROVIDER_DEEPSEEK: + check_url = f"{endpoint}/models" # DeepSeek else: # OpenAI check_url = f"{endpoint}/models" diff --git a/custom_components/ha_text_ai/api_client.py b/custom_components/ha_text_ai/api_client.py index 7f2a358..adeee68 100644 --- a/custom_components/ha_text_ai/api_client.py +++ b/custom_components/ha_text_ai/api_client.py @@ -18,6 +18,8 @@ from .const import ( API_TIMEOUT, API_RETRY_COUNT, API_PROVIDER_ANTHROPIC, + API_PROVIDER_DEEPSEEK, + API_PROVIDER_OPENAI, MIN_TEMPERATURE, MAX_TEMPERATURE, MIN_MAX_TOKENS, @@ -109,19 +111,49 @@ class APIClient: return await self._create_anthropic_completion( model, messages, temperature, max_tokens ) + elif self.api_provider == API_PROVIDER_DEEPSEEK: + return await self._create_deepseek_completion( + model, messages, temperature, max_tokens + ) else: return await self._create_openai_completion( model, messages, temperature, max_tokens ) - except (KeyError, IndexError) as e: - if "'choices'" in str(e) or "'message'" in str(e): - raise HomeAssistantError("Failed to get a response from the AI model. Please check your internet connection and try again later.") - else: - raise except Exception as e: _LOGGER.error("API request failed: %s", str(e)) raise HomeAssistantError(f"API request failed: {str(e)}") + async def _create_deepseek_completion( + self, + model: str, + messages: List[Dict[str, str]], + temperature: float, + max_tokens: int, + ) -> Dict[str, Any]: + """Create completion using DeepSeek API.""" + url = f"{self.endpoint}/chat/completions" + payload = { + "model": model, + "messages": messages, + "temperature": temperature, + "max_tokens": max_tokens, + "stream": False + } + + data = await self._make_request(url, payload) + return { + "choices": [ + { + "message": {"content": data["choices"][0]["message"]["content"]}, + } + ], + "usage": { + "prompt_tokens": data["usage"]["prompt_tokens"], + "completion_tokens": data["usage"]["completion_tokens"], + "total_tokens": data["usage"]["total_tokens"], + }, + } + async def _create_openai_completion( self, model: str, diff --git a/custom_components/ha_text_ai/config_flow.py b/custom_components/ha_text_ai/config_flow.py index 75f74a9..a263520 100644 --- a/custom_components/ha_text_ai/config_flow.py +++ b/custom_components/ha_text_ai/config_flow.py @@ -28,13 +28,16 @@ from .const import ( CONF_CONTEXT_MESSAGES, API_PROVIDER_OPENAI, API_PROVIDER_ANTHROPIC, + API_PROVIDER_DEEPSEEK, API_PROVIDERS, DEFAULT_MODEL, + DEFAULT_DEEPSEEK_MODEL, DEFAULT_TEMPERATURE, DEFAULT_MAX_TOKENS, DEFAULT_REQUEST_INTERVAL, DEFAULT_OPENAI_ENDPOINT, DEFAULT_ANTHROPIC_ENDPOINT, + DEFAULT_DEEPSEEK_ENDPOINT, DEFAULT_CONTEXT_MESSAGES, MIN_TEMPERATURE, MAX_TEMPERATURE, @@ -90,17 +93,22 @@ class HATextAIConfigFlow(config_entries.ConfigFlow, domain=DOMAIN): self._errors = {} if user_input is None: - default_endpoint = ( - DEFAULT_OPENAI_ENDPOINT if self._provider == API_PROVIDER_OPENAI - else DEFAULT_ANTHROPIC_ENDPOINT - ) + # Выбор endpoint по провайдеру + default_endpoint = { + API_PROVIDER_OPENAI: DEFAULT_OPENAI_ENDPOINT, + API_PROVIDER_ANTHROPIC: DEFAULT_ANTHROPIC_ENDPOINT, + API_PROVIDER_DEEPSEEK: DEFAULT_DEEPSEEK_ENDPOINT, + }.get(self._provider, DEFAULT_OPENAI_ENDPOINT) + + # Выбор модели по умолчанию по провайдеру + default_model = DEFAULT_DEEPSEEK_MODEL if self._provider == API_PROVIDER_DEEPSEEK else DEFAULT_MODEL return self.async_show_form( step_id="provider", data_schema=vol.Schema({ vol.Required(CONF_NAME, default="my_assistant"): str, vol.Required(CONF_API_KEY): str, - vol.Required(CONF_MODEL, default=DEFAULT_MODEL): str, + vol.Required(CONF_MODEL, default=default_model): str, vol.Required(CONF_API_ENDPOINT, default=default_endpoint): str, vol.Optional(CONF_TEMPERATURE, default=DEFAULT_TEMPERATURE): vol.All( vol.Coerce(float), @@ -156,15 +164,13 @@ class HATextAIConfigFlow(config_entries.ConfigFlow, domain=DOMAIN): if not await self._async_validate_api(input_copy): return self.async_show_form( step_id="provider", - data_schema=vol.Schema({ - }), + data_schema=vol.Schema({}), errors=self._errors ) except Exception as e: return self.async_show_form( step_id="provider", - data_schema=vol.Schema({ - }), + data_schema=vol.Schema({}), errors={"base": str(e)} ) @@ -250,6 +256,8 @@ class HATextAIConfigFlow(config_entries.ConfigFlow, domain=DOMAIN): unique_id = f"{DOMAIN}_{normalized_name}_{self._provider}".lower() + default_model = DEFAULT_DEEPSEEK_MODEL if self._provider == API_PROVIDER_DEEPSEEK else DEFAULT_MODEL + entry_data = { CONF_API_PROVIDER: self._provider, CONF_NAME: instance_name, @@ -257,7 +265,7 @@ class HATextAIConfigFlow(config_entries.ConfigFlow, domain=DOMAIN): CONF_API_KEY: user_input.get(CONF_API_KEY), CONF_API_ENDPOINT: user_input.get(CONF_API_ENDPOINT), "unique_id": unique_id, - CONF_MODEL: user_input.get(CONF_MODEL, DEFAULT_MODEL), + CONF_MODEL: user_input.get(CONF_MODEL, default_model), 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), @@ -302,7 +310,7 @@ class OptionsFlowHandler(config_entries.OptionsFlow): data_schema=vol.Schema({ vol.Optional( CONF_MODEL, - default=current_data.get(CONF_MODEL, DEFAULT_MODEL) + default=current_data.get(CONF_MODEL, default_model) ): str, vol.Optional( CONF_TEMPERATURE, diff --git a/custom_components/ha_text_ai/const.py b/custom_components/ha_text_ai/const.py index 7bd93fe..640670e 100644 --- a/custom_components/ha_text_ai/const.py +++ b/custom_components/ha_text_ai/const.py @@ -7,7 +7,7 @@ Constants for the HA text AI integration. @source: https://github.com/smkrv/ha-text-ai """ import os -import json +import json from typing import Final import voluptuous as vol from homeassistant.const import Platform, CONF_API_KEY, CONF_NAME @@ -21,10 +21,12 @@ PLATFORMS: list[str] = ["sensor"] CONF_API_PROVIDER: Final = "api_provider" API_PROVIDER_OPENAI: Final = "openai" API_PROVIDER_ANTHROPIC: Final = "anthropic" +API_PROVIDER_DEEPSEEK: Final = "deepseek" API_PROVIDERS: Final = [ API_PROVIDER_OPENAI, - API_PROVIDER_ANTHROPIC + API_PROVIDER_ANTHROPIC, + API_PROVIDER_DEEPSEEK ] # Read version from manifest.json @@ -46,6 +48,7 @@ except Exception as err: # Default endpoints DEFAULT_OPENAI_ENDPOINT: Final = "https://api.openai.com/v1" DEFAULT_ANTHROPIC_ENDPOINT: Final = "https://api.anthropic.com" +DEFAULT_DEEPSEEK_ENDPOINT: Final = "https://api.deepseek.com" # Configuration constants CONF_MODEL: Final = "model" @@ -65,6 +68,7 @@ ICONS_SUBDOMAIN = "icons" # Default values DEFAULT_MODEL: Final = "gpt-4o-mini" +DEFAULT_DEEPSEEK_MODEL: Final = "deepseek-chat" DEFAULT_TEMPERATURE: Final = 0.1 DEFAULT_MAX_TOKENS: Final = 1000 DEFAULT_REQUEST_INTERVAL: Final = 1.0 @@ -80,7 +84,7 @@ TRUNCATION_INDICATOR = " ... " MIN_TEMPERATURE: Final = 0.0 MAX_TEMPERATURE: Final = 2.0 MIN_MAX_TOKENS: Final = 1 -MAX_MAX_TOKENS: Final = 4096 +MAX_MAX_TOKENS: Final = 100000 MIN_REQUEST_INTERVAL: Final = 0.1 MAX_REQUEST_INTERVAL: Final = 60.0 diff --git a/custom_components/ha_text_ai/coordinator.py b/custom_components/ha_text_ai/coordinator.py index c2f34e4..682dcd2 100644 --- a/custom_components/ha_text_ai/coordinator.py +++ b/custom_components/ha_text_ai/coordinator.py @@ -796,46 +796,6 @@ class HATextAICoordinator(DataUpdateCoordinator): "normalized_name": self.normalized_name, } - def _calculate_context_tokens(self, messages: List[Dict[str, str]], model: Optional[str] = None) -> int: - total_tokens = 0 - - # Compile regular expressions for performance - number_pattern = re.compile(r'[0-9]') - special_char_pattern = re.compile(r'[^\w\s]') - whitespace_pattern = re.compile(r'\s+') - - try: - for message in messages: - text = message.get('content', '') - if text: - # Normalize whitespace - text = whitespace_pattern.sub(' ', text.strip()) - - # Advanced token estimation heuristics - words = text.split() - for word in words: - # Complexity-based token calculation - if len(word) > 8: # Long words - total_tokens += 2 - elif number_pattern.search(word): # Words with numbers - total_tokens += 1.5 - elif special_char_pattern.search(word): # Words with special characters - total_tokens += 1.5 - elif word.isupper(): # Acronyms and technical terms - total_tokens += 1.5 - else: # Regular words - total_tokens += 1 - - # Additional correction for technical texts - total_tokens = math.ceil(total_tokens * 1.2) - - return int(total_tokens) - - except Exception as e: - _LOGGER.error(f"Token calculation error: {e}. Processed {len(messages)} messages.") - # Safe fallback with minimal token estimation - return len(messages) * 100 - async def async_ask_question( self, question: str, @@ -876,9 +836,7 @@ class HATextAICoordinator(DataUpdateCoordinator): system_prompt: Optional[str] = None, context_messages: Optional[int] = None, ) -> dict: - """ - Enhanced question processing with intelligent token management. - """ + """Process question with context management.""" if self.client is None: raise HomeAssistantError("AI client not initialized") @@ -900,62 +858,23 @@ class HATextAICoordinator(DataUpdateCoordinator): if temp_system_prompt: messages.append({"role": "system", "content": temp_system_prompt}) - # Context history management + # Add context from history context_history = self._conversation_history[-temp_context_messages:] - - # Comprehensive token calculation - context_tokens = self._calculate_context_tokens( - [{"content": entry["question"]} for entry in context_history] + - [{"content": entry["response"]} for entry in context_history] + - [{"content": question}], - temp_model - ) - - # Dynamic token allocation - available_tokens = max(0, temp_max_tokens - context_tokens) - - # Context trimming if over token limit - if context_tokens > temp_max_tokens: - _LOGGER.warning( - f"Token limit exceeded. " - f"Context: {context_tokens}, " - f"Max: {temp_max_tokens}" - ) - - # Intelligent context reduction - while context_tokens > temp_max_tokens // 2 and context_history: - context_history.pop(0) - context_tokens = self._calculate_context_tokens( - [{"content": entry["question"]} for entry in context_history] + - [{"content": entry["response"]} for entry in context_history] + - [{"content": question}], - temp_model - ) - - # Rebuild messages with trimmed context for entry in context_history: messages.append({"role": "user", "content": entry["question"]}) messages.append({"role": "assistant", "content": entry["response"]}) + # Add current question messages.append({"role": "user", "content": question}) - # Detailed token logging - _LOGGER.debug( - f"Token Analysis: " - f"Context Tokens: {context_tokens}, " - f"Max Tokens: {temp_max_tokens}, " - f"Available Tokens: {available_tokens}" - ) - - # Prepare API call with dynamic token management + # Process message kwargs = { "model": temp_model, "temperature": temp_temperature, - "max_tokens": min(temp_max_tokens, available_tokens), + "max_tokens": temp_max_tokens, "messages": messages, } - # Process message response = await self.async_process_message(question, **kwargs) # Update metrics diff --git a/custom_components/ha_text_ai/manifest.json b/custom_components/ha_text_ai/manifest.json index 06a9022..4f08669 100644 --- a/custom_components/ha_text_ai/manifest.json +++ b/custom_components/ha_text_ai/manifest.json @@ -23,6 +23,6 @@ "single_config_entry": false, "ssdp": [], "usb": [], - "version": "2.1.0", + "version": "2.1.1", "zeroconf": [] } diff --git a/custom_components/ha_text_ai/sensor.py b/custom_components/ha_text_ai/sensor.py index f70dfaf..3857242 100644 --- a/custom_components/ha_text_ai/sensor.py +++ b/custom_components/ha_text_ai/sensor.py @@ -155,7 +155,7 @@ class HATextAISensor(CoordinatorEntity, SensorEntity): name=self._attr_name, manufacturer="Community", model=f"{model} ({api_provider} provider)", - sw_version=VERSION, + sw_version=VERSION, ) _LOGGER.debug( diff --git a/custom_components/ha_text_ai/translations/de.json b/custom_components/ha_text_ai/translations/de.json index d42eadd..904bb5e 100644 --- a/custom_components/ha_text_ai/translations/de.json +++ b/custom_components/ha_text_ai/translations/de.json @@ -19,7 +19,7 @@ "model": "Zu verwendendes AI-Modell", "api_endpoint": "Benutzerdefinierte API-Endpunkt-URL (optional)", "temperature": "Kreativität der Antwort (0-2, niedriger = fokussierter)", - "max_tokens": "Maximale Länge der Antwort (1-4096 Token)", + "max_tokens": "Maximale Länge der Antwort (1-100000 Token)", "request_interval": "Minimale Zeit zwischen Anfragen (0,1-60 Sekunden)", "context_messages": "Anzahl der zu behaltenden Kontextnachrichten (1-20)", "max_history_size": "Maximale Größe des Gesprächsverlaufs (1-100)" @@ -33,7 +33,7 @@ "api_key": "API-Schlüssel zur Authentifizierung", "model": "Zu verwendendes AI-Modell", "temperature": "Kreativität der Antwort (0-2, niedriger = fokussierter)", - "max_tokens": "Maximale Länge der Antwort (1-4096 Token)", + "max_tokens": "Maximale Länge der Antwort (1-100000 Token)", "api_endpoint": "Benutzerdefinierte API-Endpunkt-URL (optional)", "api_provider": "API-Anbieter", "request_interval": "Minimale Zeit zwischen Anfragen (0,1-60 Sekunden)", @@ -77,7 +77,7 @@ "data": { "model": "AI-Modell", "temperature": "Kreativität der Antwort (0-2)", - "max_tokens": "Maximale Länge der Antwort (1-4096)", + "max_tokens": "Maximale Länge der Antwort (1-100000)", "request_interval": "Minimale Anfrageintervall (0,1-60 Sekunden)", "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)" @@ -89,7 +89,8 @@ "api_provider": { "options": { "openai": "OpenAI (kompatibel)", - "anthropic": "Anthropic (kompatibel)" + "anthropic": "Anthropic (kompatibel)", + "deepseek": "DeepSeek" } } }, @@ -124,7 +125,7 @@ }, "max_tokens": { "name": "Max Tokens", - "description": "Maximale Länge der Antwort (1-4096 Token)" + "description": "Maximale Länge der Antwort (1-100000 Token)" } } }, diff --git a/custom_components/ha_text_ai/translations/en.json b/custom_components/ha_text_ai/translations/en.json index 1dee1d5..6f4dfc9 100644 --- a/custom_components/ha_text_ai/translations/en.json +++ b/custom_components/ha_text_ai/translations/en.json @@ -19,7 +19,7 @@ "model": "AI model to use", "api_endpoint": "Custom API endpoint URL (optional)", "temperature": "Response creativity (0-2, lower = more focused)", - "max_tokens": "Maximum response length (1-4096 tokens)", + "max_tokens": "Maximum response length (1-100000 tokens)", "request_interval": "Minimum time between requests (0.1-60 seconds)", "context_messages": "Number of context messages to retain (1-20)", "max_history_size": "Maximum conversation history size (1-100)" @@ -33,7 +33,7 @@ "api_key": "API key for authentication", "model": "AI model to use", "temperature": "Response creativity (0-2, lower = more focused)", - "max_tokens": "Maximum response length (1-4096 tokens)", + "max_tokens": "Maximum response length (1-100000 tokens)", "api_endpoint": "Custom API endpoint URL (optional)", "api_provider": "API Provider", "request_interval": "Minimum time between requests (0.1-60 seconds)", @@ -77,7 +77,7 @@ "data": { "model": "AI model", "temperature": "Response creativity (0-2)", - "max_tokens": "Maximum response length (1-4096)", + "max_tokens": "Maximum response length (1-100000)", "request_interval": "Minimum request interval (0.1-60 seconds)", "context_messages": "Number of previous messages to include in context (1-20)", "max_history_size": "Maximum conversation history size (1-100)" @@ -89,7 +89,8 @@ "api_provider": { "options": { "openai": "OpenAI (compatible)", - "anthropic": "Anthropic (compatible)" + "anthropic": "Anthropic (compatible)", + "deepseek": "DeepSeek" } } }, @@ -124,7 +125,7 @@ }, "max_tokens": { "name": "Max Tokens", - "description": "Maximum length of the response (1-4096 tokens)" + "description": "Maximum length of the response (1-100000 tokens)" } } }, diff --git a/custom_components/ha_text_ai/translations/es.json b/custom_components/ha_text_ai/translations/es.json index b0a8181..9eea8da 100644 --- a/custom_components/ha_text_ai/translations/es.json +++ b/custom_components/ha_text_ai/translations/es.json @@ -19,7 +19,7 @@ "model": "Modelo de IA a utilizar", "api_endpoint": "URL del endpoint de API personalizado (opcional)", "temperature": "Creatividad de la respuesta (0-2, menor = más enfocado)", - "max_tokens": "Longitud máxima de la respuesta (1-4096 tokens)", + "max_tokens": "Longitud máxima de la respuesta (1-100000 tokens)", "request_interval": "Tiempo mínimo entre solicitudes (0.1-60 segundos)", "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)" @@ -33,7 +33,7 @@ "api_key": "Clave API para autenticación", "model": "Modelo de IA a utilizar", "temperature": "Creatividad de la respuesta (0-2, menor = más enfocado)", - "max_tokens": "Longitud máxima de la respuesta (1-4096 tokens)", + "max_tokens": "Longitud máxima de la respuesta (1-100000 tokens)", "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)", @@ -77,7 +77,7 @@ "data": { "model": "Modelo de IA", "temperature": "Creatividad de la respuesta (0-2)", - "max_tokens": "Longitud máxima de la respuesta (1-4096)", + "max_tokens": "Longitud máxima de la respuesta (1-100000)", "request_interval": "Intervalo mínimo de solicitud (0.1-60 segundos)", "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)" @@ -89,7 +89,8 @@ "api_provider": { "options": { "openai": "OpenAI (compatible)", - "anthropic": "Anthropic (compatible)" + "anthropic": "Anthropic (compatible)", + "deepseek": "DeepSeek" } } }, @@ -124,7 +125,7 @@ }, "max_tokens": { "name": "Máx. Tokens", - "description": "Longitud máxima de la respuesta (1-4096 tokens)" + "description": "Longitud máxima de la respuesta (1-100000 tokens)" } } }, diff --git a/custom_components/ha_text_ai/translations/hi.json b/custom_components/ha_text_ai/translations/hi.json index 9b750ed..04e1ecd 100644 --- a/custom_components/ha_text_ai/translations/hi.json +++ b/custom_components/ha_text_ai/translations/hi.json @@ -19,7 +19,7 @@ "model": "उपयोग करने के लिए एआई मॉडल", "api_endpoint": "कस्टम एपीआई एंडपॉइंट यूआरएल (वैकल्पिक)", "temperature": "प्रतिक्रिया की रचनात्मकता (0-2, कम = अधिक केंद्रित)", - "max_tokens": "प्रतिक्रिया की अधिकतम लंबाई (1-4096 टोकन)", + "max_tokens": "प्रतिक्रिया की अधिकतम लंबाई (1-100000 टोकन)", "request_interval": "अनुरोधों के बीच न्यूनतम समय (0.1-60 सेकंड)", "context_messages": "रखने के लिए संदर्भ संदेशों की संख्या (1-20)", "max_history_size": "अधिकतम बातचीत इतिहास आकार (1-100)" @@ -33,7 +33,7 @@ "api_key": "प्रमाणीकरण के लिए एपीआई कुंजी", "model": "उपयोग करने के लिए एआई मॉडल", "temperature": "प्रतिक्रिया की रचनात्मकता (0-2, कम = अधिक केंद्रित)", - "max_tokens": "प्रतिक्रिया की अधिकतम लंबाई (1-4096 टोकन)", + "max_tokens": "प्रतिक्रिया की अधिकतम लंबाई (1-100000 टोकन)", "api_endpoint": "कस्टम एपीआई एंडपॉइंट यूआरएल (वैकल्पिक)", "api_provider": "एपीआई प्रदाता", "request_interval": "अनुरोधों के बीच न्यूनतम समय (0.1-60 सेकंड)", @@ -77,7 +77,7 @@ "data": { "model": "एआई मॉडल", "temperature": "प्रतिक्रिया की रचनात्मकता (0-2)", - "max_tokens": "प्रतिक्रिया की अधिकतम लंबाई (1-4096)", + "max_tokens": "प्रतिक्रिया की अधिकतम लंबाई (1-100000)", "request_interval": "न्यूनतम अनुरोध अंतराल (0.1-60 सेकंड)", "context_messages": "संदर्भ में शामिल करने के लिए पिछले संदेशों की संख्या (1-20)", "max_history_size": "अधिकतम बातचीत इतिहास आकार (1-100)" @@ -89,7 +89,8 @@ "api_provider": { "options": { "openai": "OpenAI (अनुकूलित)", - "anthropic": "Anthropic (अनुकूलित)" + "anthropic": "Anthropic (अनुकूलित)", + "deepseek": "DeepSeek" } } }, @@ -124,7 +125,7 @@ }, "max_tokens": { "name": "अधिकतम टोकन", - "description": "प्रतिक्रिया की अधिकतम लंबाई (1-4096 टोकन)" + "description": "प्रतिक्रिया की अधिकतम लंबाई (1-100000 टोकन)" } } }, diff --git a/custom_components/ha_text_ai/translations/it.json b/custom_components/ha_text_ai/translations/it.json index c14f29c..06981c0 100644 --- a/custom_components/ha_text_ai/translations/it.json +++ b/custom_components/ha_text_ai/translations/it.json @@ -19,7 +19,7 @@ "model": "Modello AI da utilizzare", "api_endpoint": "URL dell'endpoint API personalizzato (opzionale)", "temperature": "Creatività della risposta (0-2, più basso = più focalizzato)", - "max_tokens": "Lunghezza massima della risposta (1-4096 token)", + "max_tokens": "Lunghezza massima della risposta (1-100000 token)", "request_interval": "Tempo minimo tra le richieste (0.1-60 secondi)", "context_messages": "Numero di messaggi di contesto da mantenere (1-20)", "max_history_size": "Dimensione massima della cronologia delle conversazioni (1-100)" @@ -33,7 +33,7 @@ "api_key": "Chiave API per l'autenticazione", "model": "Modello AI da utilizzare", "temperature": "Creatività della risposta (0-2, più basso = più focalizzato)", - "max_tokens": "Lunghezza massima della risposta (1-4096 token)", + "max_tokens": "Lunghezza massima della risposta (1-100000 token)", "api_endpoint": "URL dell'endpoint API personalizzato (opzionale)", "api_provider": "Fornitore API", "request_interval": "Tempo minimo tra le richieste (0.1-60 secondi)", @@ -77,7 +77,7 @@ "data": { "model": "Modello AI", "temperature": "Creatività della risposta (0-2)", - "max_tokens": "Lunghezza massima della risposta (1-4096)", + "max_tokens": "Lunghezza massima della risposta (1-100000)", "request_interval": "Intervallo minimo di richiesta (0.1-60 secondi)", "context_messages": "Numero di messaggi precedenti da includere nel contesto (1-20)", "max_history_size": "Dimensione massima della cronologia delle conversazioni (1-100)" @@ -89,7 +89,8 @@ "api_provider": { "options": { "openai": "OpenAI (compatibile)", - "anthropic": "Anthropic (compatibile)" + "anthropic": "Anthropic (compatibile)", + "deepseek": "DeepSeek" } } }, @@ -124,7 +125,7 @@ }, "max_tokens": { "name": "Token massimi", - "description": "Lunghezza massima della risposta (1-4096 token)" + "description": "Lunghezza massima della risposta (1-100000 token)" } } }, diff --git a/custom_components/ha_text_ai/translations/ru.json b/custom_components/ha_text_ai/translations/ru.json index cfb9195..06081d3 100644 --- a/custom_components/ha_text_ai/translations/ru.json +++ b/custom_components/ha_text_ai/translations/ru.json @@ -19,7 +19,7 @@ "model": "Модель ИИ для использования", "api_endpoint": "Пользовательский URL-адрес конечной точки API (необязательно)", "temperature": "Креативность ответа (0-2, меньше = более сфокусированно)", - "max_tokens": "Максимальная длина ответа (1-4096 токенов)", + "max_tokens": "Максимальная длина ответа (1-100000 токенов)", "request_interval": "Минимальный интервал между запросами (0.1-60 секунд)", "context_messages": "Количество сохраняемых контекстных сообщений (1-20)", "max_history_size": "Максимальный размер истории разговора (1-100)" @@ -33,7 +33,7 @@ "api_key": "API-ключ для аутентификации", "model": "Модель ИИ для использования", "temperature": "Креативность ответа (0-2, меньше = более сфокусированно)", - "max_tokens": "Максимальная длина ответа (1-4096 токенов)", + "max_tokens": "Максимальная длина ответа (1-100000 токенов)", "api_endpoint": "Пользовательский URL-адрес конечной точки API (необязательно)", "api_provider": "Провайдер API", "request_interval": "Минимальный интервал между запросами (0.1-60 секунд)", @@ -77,7 +77,7 @@ "data": { "model": "Модель ИИ", "temperature": "Креативность ответа (0-2)", - "max_tokens": "Максимальная длина ответа (1-4096)", + "max_tokens": "Максимальная длина ответа (1-100000)", "request_interval": "Минимальный интервал между запросами (0.1-60 секунд)", "context_messages": "Количество предыдущих сообщений для включения в контекст (1-20)", "max_history_size": "Максимальный размер истории разговора (1-100)" @@ -89,7 +89,8 @@ "api_provider": { "options": { "openai": "OpenAI (совместимый)", - "anthropic": "Anthropic (совместимый)" + "anthropic": "Anthropic (совместимый)", + "deepseek": "DeepSeek" } } }, @@ -124,7 +125,7 @@ }, "max_tokens": { "name": "Максимум токенов", - "description": "Максимальная длина ответа (1-4096 токенов)" + "description": "Максимальная длина ответа (1-100000 токенов)" } } }, diff --git a/custom_components/ha_text_ai/translations/sr.json b/custom_components/ha_text_ai/translations/sr.json index f9126c3..f300711 100644 --- a/custom_components/ha_text_ai/translations/sr.json +++ b/custom_components/ha_text_ai/translations/sr.json @@ -19,7 +19,7 @@ "model": "AI модел који ће се користити", "api_endpoint": "Прилагођени URL API крајње тачке (опционо)", "temperature": "Креативност одговора (0-2, нижа = фокусираније)", - "max_tokens": "Максимална дужина одговора (1-4096 токена)", + "max_tokens": "Максимална дужина одговора (1-100000 токена)", "request_interval": "Минимално време између захтева (0.1-60 секунди)", "context_messages": "Број контекстуалних порука које треба задржати (1-20)", "max_history_size": "Максимална величина историје разговора (1-100)" @@ -33,7 +33,7 @@ "api_key": "API кључ за аутентификацију", "model": "AI модел који ће се користити", "temperature": "Креативност одговора (0-2, нижа = фокусираније)", - "max_tokens": "Максимална дужина одговора (1-4096 токена)", + "max_tokens": "Максимална дужина одговора (1-100000 токена)", "api_endpoint": "Прилагођени URL API крајње тачке (опционо)", "api_provider": "API провајдер", "request_interval": "Минимално време између захтева (0.1-60 секунди)", @@ -77,7 +77,7 @@ "data": { "model": "AI модел", "temperature": "Креативност одговора (0-2)", - "max_tokens": "Максимална дужина одговора (1-4096)", + "max_tokens": "Максимална дужина одговора (1-100000)", "request_interval": "Минимално време између захтева (0.1-60 секунди)", "context_messages": "Број претходних порука које треба укључити у контекст (1-20)", "max_history_size": "Максимална величина историје разговора (1-100)" @@ -89,7 +89,8 @@ "api_provider": { "options": { "openai": "OpenAI (компатибилан)", - "anthropic": "Anthropic (компатибилан)" + "anthropic": "Anthropic (компатибилан)", + "deepseek": "DeepSeek" } } }, @@ -124,7 +125,7 @@ }, "max_tokens": { "name": "Максимални токени", - "description": "Максимална дужина одговора (1-4096 токена)" + "description": "Максимална дужина одговора (1-100000 токена)" } } }, diff --git a/custom_components/ha_text_ai/translations/zh.json b/custom_components/ha_text_ai/translations/zh.json index 8cc6a5e..4f0d10f 100644 --- a/custom_components/ha_text_ai/translations/zh.json +++ b/custom_components/ha_text_ai/translations/zh.json @@ -19,7 +19,7 @@ "model": "要使用的AI模型", "api_endpoint": "自定义API端点URL(可选)", "temperature": "响应创造力(0-2,越低越专注)", - "max_tokens": "最大响应长度(1-4096个标记)", + "max_tokens": "最大响应长度(1-100000个标记)", "request_interval": "请求之间的最小时间(0.1-60秒)", "context_messages": "保留的上下文消息数量(1-20)", "max_history_size": "最大对话历史大小(1-100)" @@ -33,7 +33,7 @@ "api_key": "用于身份验证的API密钥", "model": "要使用的AI模型", "temperature": "响应创造力(0-2,越低越专注)", - "max_tokens": "最大响应长度(1-4096个标记)", + "max_tokens": "最大响应长度(1-100000个标记)", "api_endpoint": "自定义API端点URL(可选)", "api_provider": "API提供者", "request_interval": "请求之间的最小时间(0.1-60秒)", @@ -77,7 +77,7 @@ "data": { "model": "AI模型", "temperature": "响应创造力(0-2)", - "max_tokens": "最大响应长度(1-4096)", + "max_tokens": "最大响应长度(1-100000)", "request_interval": "最小请求间隔(0.1-60秒)", "context_messages": "要包含在上下文中的先前消息数量(1-20)", "max_history_size": "最大对话历史大小(1-100)" @@ -89,7 +89,8 @@ "api_provider": { "options": { "openai": "OpenAI(兼容)", - "anthropic": "Anthropic(兼容)" + "anthropic": "Anthropic(兼容)", + "deepseek": "DeepSeek " } } }, @@ -124,7 +125,7 @@ }, "max_tokens": { "name": "最大标记数", - "description": "响应的最大长度(1-4096个标记)" + "description": "响应的最大长度(1-100000个标记)" } } },