mirror of
https://github.com/smkrv/ha-text-ai.git
synced 2026-07-29 05:13:56 +08:00
fix: Comprehensive v2.4.0 quality pass — 24 review findings + review agent fixes
Phase A — Critical: - Remove dual timeout stacking in coordinator._send_to_api - Add Gemini-specific asyncio.timeout (sync SDK via to_thread) - Store full text in history for context; cap per-field at 32KB on disk - Fix instance lookup to match by normalized_name - Add Bearer/sk-/x-api-key credential sanitization patterns Phase B — Dead code removal: - Merge async_ask_question/async_process_question into single method - Remove dead is_anthropic flag from coordinator and __init__ - Remove unused DEFAULT_TIMEOUT and API_TIMEOUT constants - Remove redundant _create_history_dir calls - Consolidate async_check_api to use provider registry Phase C — Config flow correctness: - Truncate name before uniqueness check (prevent post-truncation collisions) - Add async_set_unique_id + _abort_if_unique_id_configured - Extract shared _build_parameter_schema for ConfigFlow/OptionsFlow dedup Phase D — UX improvements: - Optimize history write: serialize from memory, single file write - Show last 5 history entries in sensor attributes (was 1) - Return actual error type in ask_question service response - Add dedicated api_key_required error for provider/endpoint changes - Pass config_entry to DataUpdateCoordinator (HA 2024.8+) Phase E — Cleanup: - Extract _apply_structured_output for OpenAI/DeepSeek dedup - Reduce ABSOLUTE_MAX_HISTORY_SIZE to 200 with Final annotation - Remove dead translation keys (queued, invalid_characters) - Migrate to _attr_has_entity_name = True - Add from __future__ import annotations to all modules - Remove redundant api_status sensor attribute - Add missing translation keys (last_model, last_timestamp, etc.) Review agent fixes: - Add archive file cleanup (max 3 archives) to prevent disk exhaustion - Per-entry storage cap (32KB per field) for history on disk
This commit is contained in:
@@ -42,6 +42,7 @@
|
||||
"name_exists": "An instance with this name already exists",
|
||||
"invalid_name": "Invalid instance name",
|
||||
"invalid_auth": "Authentication failed - check your API key",
|
||||
"api_key_required": "API key is required when changing provider or endpoint",
|
||||
"invalid_api_key": "Invalid API key - please verify your credentials",
|
||||
"cannot_connect": "Failed to connect to API service",
|
||||
"invalid_model": "Selected model is not available",
|
||||
@@ -55,7 +56,6 @@
|
||||
"invalid_instance": "Invalid instance specified",
|
||||
"unknown": "Unexpected error occurred",
|
||||
"empty": "Name cannot be empty",
|
||||
"invalid_characters": "Name can only contain letters, numbers, spaces, underscores and hyphens",
|
||||
"name_too_long": "Name must be 50 characters or less"
|
||||
},
|
||||
"abort": {
|
||||
@@ -208,8 +208,7 @@
|
||||
"rate_limited": "Rate Limited",
|
||||
"maintenance": "Maintenance",
|
||||
"initializing": "Initializing",
|
||||
"retrying": "Retrying",
|
||||
"queued": "Queued"
|
||||
"retrying": "Retrying"
|
||||
},
|
||||
"state_attributes": {
|
||||
"question": {
|
||||
@@ -301,6 +300,24 @@
|
||||
},
|
||||
"min_latency": {
|
||||
"name": "Minimum Latency"
|
||||
},
|
||||
"last_model": {
|
||||
"name": "Last Used Model"
|
||||
},
|
||||
"last_timestamp": {
|
||||
"name": "Last Response Time"
|
||||
},
|
||||
"instance_name": {
|
||||
"name": "Instance Name"
|
||||
},
|
||||
"normalized_name": {
|
||||
"name": "Normalized Name"
|
||||
},
|
||||
"last_error": {
|
||||
"name": "Last Error"
|
||||
},
|
||||
"conversation_history": {
|
||||
"name": "Conversation History"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user