mirror of
https://github.com/acon96/home-llm.git
synced 2026-01-08 05:14:02 -05:00
92
README.md
92
README.md
@@ -37,7 +37,7 @@ The latest models can be found on HuggingFace:
|
||||
|
||||
**Gemma3**:
|
||||
1B: TBD
|
||||
270M: TBD
|
||||
270M: https://huggingface.co/acon96/Home-FunctionGemma-270m
|
||||
|
||||
<details>
|
||||
|
||||
@@ -61,105 +61,21 @@ NOTE: The models below are only compatible with version 0.2.17 and older!
|
||||
|
||||
The model is quantized using Llama.cpp in order to enable running the model in super low resource environments that are common with Home Assistant installations such as Raspberry Pis.
|
||||
|
||||
The model can be used as an "instruct" type model using the [ChatML](https://github.com/MicrosoftDocs/azure-docs/blob/main/articles/ai-services/openai/includes/chat-markup-language.md) or [Zephyr](https://huggingface.co/HuggingFaceH4/zephyr-7b-alpha/discussions/3) prompt format (depends on the model). The system prompt is used to provide information about the state of the Home Assistant installation including available devices and callable services.
|
||||
|
||||
Example "system" prompt:
|
||||
```
|
||||
You are 'Al', a helpful AI Assistant that controls the devices in a house. Complete the following task as instructed with the information provided only.
|
||||
The current time and date is 08:12 AM on Thursday March 14, 2024
|
||||
Services: light.turn_off(), light.turn_on(brightness,rgb_color), fan.turn_on(), fan.turn_off()
|
||||
Devices:
|
||||
light.office 'Office Light' = on;80%
|
||||
fan.office 'Office fan' = off
|
||||
light.kitchen 'Kitchen Light' = on;80%;red
|
||||
light.bedroom 'Bedroom Light' = off
|
||||
```
|
||||
|
||||
For more about how the model is prompted see [Model Prompting](/docs/Model%20Prompting.md)
|
||||
|
||||
Output from the model will consist of a response that should be relayed back to the user, along with an optional code block that will invoke different Home Assistant "services". The output format from the model for function calling is as follows:
|
||||
|
||||
`````
|
||||
turning on the kitchen lights for you now
|
||||
```homeassistant
|
||||
{ "service": "light.turn_on", "target_device": "light.kitchen" }
|
||||
```
|
||||
`````
|
||||
|
||||
Due to the mix of data used during fine tuning, the 3B model is also capable of basic instruct and QA tasks. For example, the model is able to perform basic logic tasks such as the following (Zephyr prompt format shown):
|
||||
|
||||
```
|
||||
<|system|>You are 'Al', a helpful AI Assistant that controls the devices in a house. Complete the following task as instructed with the information provided only.
|
||||
*snip*
|
||||
<|endoftext|>
|
||||
<|user|>
|
||||
if mary is 7 years old, and I am 3 years older than her. how old am I?<|endoftext|>
|
||||
<|assistant|>
|
||||
If Mary is 7 years old, then you are 10 years old (7+3=10).<|endoftext|>
|
||||
```
|
||||
|
||||
### Synthetic Dataset
|
||||
The synthetic dataset is aimed at covering basic day to day operations in home assistant such as turning devices on and off.
|
||||
The supported entity types are: light, fan, cover, lock, media_player, climate, switch
|
||||
|
||||
The dataset is available on HuggingFace: https://huggingface.co/datasets/acon96/Home-Assistant-Requests
|
||||
The dataset is available on HuggingFace: https://huggingface.co/datasets/acon96/Home-Assistant-Requests-V2
|
||||
The source for the dataset is in the [data](/data) of this repository.
|
||||
|
||||
### Training
|
||||
|
||||
If you want to prepare your own training environment, see the details on how to do it in the [Training Guide](./docs/Training.md) document.
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Training Details</summary>
|
||||
|
||||
The 3B model was trained as a full fine-tuning on 2x RTX 4090 (48GB). Training time took approximately 28 hours. It was trained on the `--large` dataset variant.
|
||||
|
||||
```console
|
||||
accelerate launch --config_file fsdp_config.yaml train.py \
|
||||
--run_name home-3b \
|
||||
--base_model stabilityai/stablelm-zephyr-3b \
|
||||
--bf16 \
|
||||
--train_dataset data/home_assistant_train.jsonl \
|
||||
--learning_rate 1e-5 \
|
||||
--batch_size 64 \
|
||||
--epochs 1 \
|
||||
--micro_batch_size 2 \
|
||||
--gradient_checkpointing \
|
||||
--group_by_length \
|
||||
--ctx_size 2048 \
|
||||
--save_steps 50 \
|
||||
--save_total_limit 10 \
|
||||
--eval_steps 100 \
|
||||
--logging_steps 2
|
||||
```
|
||||
|
||||
The 1B model was trained as a full fine-tuning on an RTX 3090 (24GB). Training took approximately 2 hours. It was trained on the `--medium` dataset variant.
|
||||
|
||||
```console
|
||||
python3 train.py \
|
||||
--run_name home-1b \
|
||||
--base_model TinyLlama/TinyLlama-1.1B-Chat-v1.0 \
|
||||
--bf16 \
|
||||
--train_dataset data/home_assistant_train.jsonl \
|
||||
--test_dataset data/home_assistant_test.jsonl \
|
||||
--learning_rate 2e-5 \
|
||||
--batch_size 32 \
|
||||
--micro_batch_size 8 \
|
||||
--gradient_checkpointing \
|
||||
--group_by_length \
|
||||
--ctx_size 2048 \
|
||||
--save_steps 100 \
|
||||
--save_total_limit 10
|
||||
--prefix_ids 29966,29989,465,22137,29989,29958,13 \
|
||||
--suffix_ids 2
|
||||
```
|
||||
</details>
|
||||
|
||||
If you want to fine-tune a model yourself, see the details on how to do it in the [Training README](./train/README.md).
|
||||
|
||||
## Version History
|
||||
| Version | Description |
|
||||
|---------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
|
||||
| v0.4.6 | New dataset supporting proper tool calling, Add Anthropic "messages" style API support, Add on-disk caching for Llama.cpp backend |
|
||||
| v0.4.5 | Add support for AI Task entities, Replace custom Ollama API implementation with the official `ollama-python` package to avoid future compatibility issues, Support multiple LLM APIs at once, Fix issues in tool call handling for various backends |
|
||||
| v0.4.4 | Fix issue with OpenAI backends appending `/v1` to all URLs, and fix an issue with tools being serialized into the system prompt. |
|
||||
| v0.4.3 | Fix an issue with the integration not creating model configs properly during setup |
|
||||
|
||||
12
TODO.md
12
TODO.md
@@ -1,12 +1,14 @@
|
||||
# TODO
|
||||
- [ ] new model based on qwen3 0.6b, 1.7b and 4b
|
||||
- [ ] new model based on gemma3 270m
|
||||
- [ ] support AI task API
|
||||
- [ ] vision support for remote backends
|
||||
- [x] add examples of 'fixing' a failed tool call to the dataset
|
||||
- [x] add proper 'refusals' to the dataset (i.e. tool/device not available or device is already in the desired state)
|
||||
- [ ] new model based on qwen3 0.6b, 1.7b and 4b
|
||||
- [x] new model based on gemma3 270m
|
||||
- [x] support AI task API
|
||||
- [x] vision support for remote backends
|
||||
- [ ] vision support for local backend (llama.cpp + llava)
|
||||
- [ ] move llamacpp to a separate process because of all the crashing
|
||||
- [ ] optional sampling parameters in options panel (don't pass to backend if not set)
|
||||
- [ ] update dataset so new models will work with the Assist API
|
||||
- [x] update dataset so new models will work with the Assist API
|
||||
- [ ] make ICL examples into conversation turns
|
||||
- [ ] translate ICL examples + make better ones
|
||||
- [ ] figure out DPO to improve response quality
|
||||
|
||||
@@ -3,6 +3,7 @@ from __future__ import annotations
|
||||
|
||||
import logging
|
||||
import os
|
||||
import shutil
|
||||
from typing import Final
|
||||
|
||||
from homeassistant.config_entries import ConfigEntry, ConfigSubentry
|
||||
@@ -24,8 +25,8 @@ from .const import (
|
||||
CONF_BACKEND_TYPE,
|
||||
CONF_INSTALLED_LLAMACPP_VERSION,
|
||||
CONF_SELECTED_LANGUAGE,
|
||||
CONF_OPENAI_API_KEY,
|
||||
CONF_GENERIC_OPENAI_PATH,
|
||||
CONF_API_KEY,
|
||||
CONF_API_PATH,
|
||||
CONF_CHAT_MODEL, CONF_DOWNLOADED_MODEL_QUANTIZATION, CONF_DOWNLOADED_MODEL_FILE, CONF_REQUEST_TIMEOUT, CONF_MAX_TOOL_CALL_ITERATIONS,
|
||||
CONF_REFRESH_SYSTEM_PROMPT, CONF_REMEMBER_CONVERSATION, CONF_REMEMBER_NUM_INTERACTIONS, CONF_REMEMBER_CONVERSATION_TIME_MINUTES,
|
||||
CONF_PROMPT, CONF_TEMPERATURE, CONF_TOP_K, CONF_TOP_P, CONF_MIN_P, CONF_TYPICAL_P, CONF_MAX_TOKENS,
|
||||
@@ -43,6 +44,7 @@ from .const import (
|
||||
BACKEND_TYPE_GENERIC_OPENAI_RESPONSES,
|
||||
BACKEND_TYPE_LLAMA_CPP_SERVER,
|
||||
BACKEND_TYPE_OLLAMA,
|
||||
BACKEND_TYPE_ANTHROPIC,
|
||||
BACKEND_TYPE_LLAMA_EXISTING_OLD,
|
||||
BACKEND_TYPE_LLAMA_HF_OLD,
|
||||
)
|
||||
@@ -51,6 +53,7 @@ from .backends.llamacpp import LlamaCppClient
|
||||
from .backends.generic_openai import GenericOpenAIAPIClient, GenericOpenAIResponsesAPIClient
|
||||
from .backends.tailored_openai import TextGenerationWebuiClient, LlamaCppServerClient
|
||||
from .backends.ollama import OllamaAPIClient
|
||||
from .backends.anthropic import AnthropicAPIClient
|
||||
from .utils import get_llama_cpp_python_version, download_model_from_hf
|
||||
|
||||
_LOGGER = logging.getLogger(__name__)
|
||||
@@ -63,9 +66,10 @@ BACKEND_TO_CLS: dict[str, type[LocalLLMClient]] = {
|
||||
BACKEND_TYPE_LLAMA_CPP: LlamaCppClient,
|
||||
BACKEND_TYPE_GENERIC_OPENAI: GenericOpenAIAPIClient,
|
||||
BACKEND_TYPE_GENERIC_OPENAI_RESPONSES: GenericOpenAIResponsesAPIClient,
|
||||
BACKEND_TYPE_TEXT_GEN_WEBUI: TextGenerationWebuiClient,
|
||||
BACKEND_TYPE_TEXT_GEN_WEBUI: TextGenerationWebuiClient,
|
||||
BACKEND_TYPE_LLAMA_CPP_SERVER: LlamaCppServerClient,
|
||||
BACKEND_TYPE_OLLAMA: OllamaAPIClient,
|
||||
BACKEND_TYPE_ANTHROPIC: AnthropicAPIClient,
|
||||
}
|
||||
|
||||
async def async_setup_entry(hass: HomeAssistant, entry: LocalLLMConfigEntry) -> bool:
|
||||
@@ -78,7 +82,9 @@ async def async_setup_entry(hass: HomeAssistant, entry: LocalLLMConfigEntry) ->
|
||||
|
||||
def create_client(backend_type):
|
||||
_LOGGER.debug("Creating Local LLM client of type %s", backend_type)
|
||||
return BACKEND_TO_CLS[backend_type](hass, dict(entry.options))
|
||||
# Merge entry.data and entry.options - data has connection info, options has model settings
|
||||
client_options = {**dict(entry.data), **dict(entry.options)}
|
||||
return BACKEND_TO_CLS[backend_type](hass, client_options)
|
||||
|
||||
# create the agent in an executor job because the constructor calls `open()`
|
||||
backend_type = entry.data.get(CONF_BACKEND_TYPE, DEFAULT_BACKEND_TYPE)
|
||||
@@ -96,9 +102,18 @@ async def _async_update_listener(hass: HomeAssistant, entry: LocalLLMConfigEntry
|
||||
await hass.config_entries.async_reload(entry.entry_id)
|
||||
|
||||
async def async_unload_entry(hass: HomeAssistant, entry: LocalLLMConfigEntry) -> bool:
|
||||
"""Unload Ollama."""
|
||||
"""Unload the integration."""
|
||||
if not await hass.config_entries.async_unload_platforms(entry, PLATFORMS):
|
||||
return False
|
||||
|
||||
if entry.data[CONF_BACKEND_TYPE] == BACKEND_TYPE_LLAMA_CPP:
|
||||
# clean up any disk cache resources
|
||||
def cleanup_cache_dir():
|
||||
cache_dir = entry.data[CONF_CHAT_MODEL].strip().replace(" ", "_").lower()
|
||||
full_path = os.path.join(hass.config.media_dirs.get("local", hass.config.path("media")), "kv_cache", cache_dir)
|
||||
shutil.rmtree(full_path, ignore_errors=True)
|
||||
|
||||
await hass.async_add_executor_job(cleanup_cache_dir)
|
||||
hass.data[DOMAIN].pop(entry.entry_id)
|
||||
return True
|
||||
|
||||
@@ -115,7 +130,7 @@ async def async_migrate_entry(hass: HomeAssistant, config_entry: LocalLLMConfigE
|
||||
# Migrate the config_entry to be an entry + sub-entry
|
||||
if config_entry.version == 2:
|
||||
ENTRY_DATA_KEYS = [CONF_BACKEND_TYPE]
|
||||
ENTRY_OPTIONS_KEYS = [CONF_SELECTED_LANGUAGE, CONF_HOST, CONF_PORT, CONF_SSL, CONF_OPENAI_API_KEY, CONF_GENERIC_OPENAI_PATH]
|
||||
ENTRY_OPTIONS_KEYS = [CONF_SELECTED_LANGUAGE, CONF_HOST, CONF_PORT, CONF_SSL, CONF_API_KEY, CONF_API_PATH]
|
||||
SUBENTRY_KEYS = [
|
||||
CONF_CHAT_MODEL, CONF_DOWNLOADED_MODEL_QUANTIZATION, CONF_DOWNLOADED_MODEL_FILE, CONF_REQUEST_TIMEOUT, CONF_MAX_TOOL_CALL_ITERATIONS,
|
||||
CONF_REFRESH_SYSTEM_PROMPT, CONF_REMEMBER_CONVERSATION, CONF_REMEMBER_NUM_INTERACTIONS, CONF_REMEMBER_CONVERSATION_TIME_MINUTES,
|
||||
@@ -144,7 +159,7 @@ async def async_migrate_entry(hass: HomeAssistant, config_entry: LocalLLMConfigE
|
||||
entry_options[CONF_INSTALLED_LLAMACPP_VERSION] = await hass.async_add_executor_job(get_llama_cpp_python_version)
|
||||
else:
|
||||
# ensure all remote backends have a path set
|
||||
entry_options[CONF_GENERIC_OPENAI_PATH] = entry_options.get(CONF_GENERIC_OPENAI_PATH, "")
|
||||
entry_options[CONF_API_PATH] = entry_options.get(CONF_API_PATH, "")
|
||||
|
||||
entry_title = BACKEND_TO_CLS[backend].get_name(entry_options)
|
||||
|
||||
|
||||
413
custom_components/llama_conversation/backends/anthropic.py
Normal file
413
custom_components/llama_conversation/backends/anthropic.py
Normal file
@@ -0,0 +1,413 @@
|
||||
"""Defines the Anthropic-compatible Messages API backend."""
|
||||
from __future__ import annotations
|
||||
|
||||
import aiohttp
|
||||
import json
|
||||
import logging
|
||||
from typing import Any, AsyncGenerator, Dict, List, Optional, Tuple
|
||||
|
||||
from anthropic import AsyncAnthropic, APIError, APIConnectionError, APITimeoutError, AuthenticationError
|
||||
|
||||
from homeassistant.components import conversation as conversation
|
||||
from homeassistant.core import HomeAssistant
|
||||
from homeassistant.exceptions import HomeAssistantError
|
||||
from homeassistant.helpers import llm
|
||||
|
||||
from voluptuous_openapi import convert as convert_to_openapi
|
||||
|
||||
from custom_components.llama_conversation.const import (
|
||||
CONF_CHAT_MODEL,
|
||||
CONF_MAX_TOKENS,
|
||||
CONF_TEMPERATURE,
|
||||
CONF_TOP_P,
|
||||
CONF_TOP_K,
|
||||
CONF_REQUEST_TIMEOUT,
|
||||
CONF_ENABLE_LEGACY_TOOL_CALLING,
|
||||
CONF_TOOL_RESPONSE_AS_STRING,
|
||||
CONF_API_KEY,
|
||||
CONF_API_PATH,
|
||||
CONF_BASE_URL,
|
||||
DEFAULT_MAX_TOKENS,
|
||||
DEFAULT_TEMPERATURE,
|
||||
DEFAULT_TOP_P,
|
||||
DEFAULT_TOP_K,
|
||||
DEFAULT_REQUEST_TIMEOUT,
|
||||
DEFAULT_ENABLE_LEGACY_TOOL_CALLING,
|
||||
DEFAULT_TOOL_RESPONSE_AS_STRING,
|
||||
DEFAULT_API_PATH,
|
||||
)
|
||||
|
||||
from custom_components.llama_conversation.entity import LocalLLMClient, TextGenerationResult
|
||||
from custom_components.llama_conversation.utils import get_file_contents_base64
|
||||
|
||||
_LOGGER = logging.getLogger(__name__)
|
||||
|
||||
|
||||
def _convert_to_anthropic_messages(
|
||||
conversation_messages: List[conversation.Content],
|
||||
tool_result_to_str: bool = True,
|
||||
) -> Tuple[str, List[Dict[str, Any]]]:
|
||||
"""
|
||||
Convert Home Assistant conversation format to Anthropic Messages API format.
|
||||
|
||||
Returns:
|
||||
Tuple of (system_prompt, messages_list)
|
||||
|
||||
Note: Anthropic requires system prompt as a separate parameter, not in messages.
|
||||
"""
|
||||
system_prompt = ""
|
||||
messages: List[Dict[str, Any]] = []
|
||||
|
||||
for message in conversation_messages:
|
||||
if message.role == "system":
|
||||
# Anthropic handles system prompts separately
|
||||
system_prompt = message.content if hasattr(message, 'content') else str(message)
|
||||
elif message.role == "user":
|
||||
content = []
|
||||
msg_content = message.content if hasattr(message, 'content') else str(message)
|
||||
if msg_content:
|
||||
content.append({"type": "text", "text": msg_content})
|
||||
|
||||
# Handle image attachments (Anthropic supports vision)
|
||||
if hasattr(message, 'attachments') and message.attachments:
|
||||
for attachment in message.attachments:
|
||||
if hasattr(attachment, 'mime_type') and attachment.mime_type.startswith("image/"):
|
||||
try:
|
||||
image_data = get_file_contents_base64(attachment.path)
|
||||
# get_file_contents_base64 returns data:mime;base64,xxx format
|
||||
# Extract just the base64 part for Anthropic
|
||||
if image_data.startswith("data:"):
|
||||
# Remove the data URI prefix
|
||||
image_data = image_data.split(",", 1)[1] if "," in image_data else image_data
|
||||
content.append({
|
||||
"type": "image",
|
||||
"source": {
|
||||
"type": "base64",
|
||||
"media_type": attachment.mime_type,
|
||||
"data": image_data,
|
||||
}
|
||||
})
|
||||
except Exception as e:
|
||||
_LOGGER.warning("Failed to load image attachment: %s", e)
|
||||
|
||||
if content:
|
||||
messages.append({"role": "user", "content": content})
|
||||
elif message.role == "assistant":
|
||||
content = []
|
||||
msg_content = message.content if hasattr(message, 'content') else None
|
||||
if msg_content:
|
||||
content.append({"type": "text", "text": str(msg_content)})
|
||||
|
||||
# Handle tool calls (Anthropic's tool_use format)
|
||||
if hasattr(message, 'tool_calls') and message.tool_calls:
|
||||
for tool_call in message.tool_calls:
|
||||
tool_id = getattr(tool_call, 'id', None) or f"toolu_{id(tool_call)}"
|
||||
content.append({
|
||||
"type": "tool_use",
|
||||
"id": tool_id,
|
||||
"name": tool_call.tool_name,
|
||||
"input": tool_call.tool_args if isinstance(tool_call.tool_args, dict) else {},
|
||||
})
|
||||
|
||||
if content:
|
||||
messages.append({"role": "assistant", "content": content})
|
||||
elif message.role == "tool_result":
|
||||
# Anthropic expects tool results in user messages with tool_result content
|
||||
tool_result = message.tool_result if hasattr(message, 'tool_result') else {}
|
||||
if tool_result_to_str:
|
||||
result_content = json.dumps(tool_result) if isinstance(tool_result, dict) else str(tool_result)
|
||||
else:
|
||||
result_content = str(tool_result)
|
||||
|
||||
tool_call_id = getattr(message, 'tool_call_id', None) or "unknown"
|
||||
|
||||
messages.append({
|
||||
"role": "user",
|
||||
"content": [{
|
||||
"type": "tool_result",
|
||||
"tool_use_id": tool_call_id,
|
||||
"content": result_content,
|
||||
}]
|
||||
})
|
||||
|
||||
return system_prompt, messages
|
||||
|
||||
|
||||
def _convert_tools_to_anthropic_format(
|
||||
llm_api: llm.APIInstance,
|
||||
) -> List[Dict[str, Any]]:
|
||||
"""Convert Home Assistant LLM tools to Anthropic tool format."""
|
||||
tools: List[Dict[str, Any]] = []
|
||||
|
||||
for tool in sorted(llm_api.tools, key=lambda t: t.name):
|
||||
schema = convert_to_openapi(tool.parameters, custom_serializer=llm_api.custom_serializer)
|
||||
tools.append({
|
||||
"name": tool.name,
|
||||
"description": tool.description or "",
|
||||
"input_schema": schema,
|
||||
})
|
||||
|
||||
return tools
|
||||
|
||||
|
||||
class AnthropicAPIClient(LocalLLMClient):
|
||||
"""Implements the Anthropic-compatible Messages API backend."""
|
||||
|
||||
api_key: str
|
||||
base_url: str
|
||||
api_path: str
|
||||
|
||||
def __init__(self, hass: HomeAssistant, client_options: dict[str, Any]) -> None:
|
||||
super().__init__(hass, client_options)
|
||||
|
||||
self.api_key = client_options.get(CONF_API_KEY, "")
|
||||
self.base_url = client_options.get(CONF_BASE_URL, "")
|
||||
self.api_path = client_options.get(CONF_API_PATH, DEFAULT_API_PATH)
|
||||
|
||||
async def _async_build_client(self, timeout: float | None = None) -> AsyncAnthropic:
|
||||
"""Build an async Anthropic client (runs in executor to avoid blocking SSL ops)."""
|
||||
effective_timeout = timeout or DEFAULT_REQUEST_TIMEOUT
|
||||
|
||||
kwargs: Dict[str, Any] = {
|
||||
"timeout": effective_timeout,
|
||||
"base_url": self.base_url,
|
||||
# Use dummy key for SDK, set auth via headers for compatible API support
|
||||
"api_key": "dummy-key-for-sdk",
|
||||
"default_headers": {
|
||||
"Authorization": self.api_key,
|
||||
"x-api-key": self.api_key,
|
||||
},
|
||||
}
|
||||
|
||||
def create_client():
|
||||
return AsyncAnthropic(**kwargs)
|
||||
|
||||
return await self.hass.async_add_executor_job(create_client)
|
||||
|
||||
@staticmethod
|
||||
def get_name(client_options: dict[str, Any]) -> str:
|
||||
base_url = client_options.get(CONF_BASE_URL, "")
|
||||
return f"Anthropic-compatible API at '{base_url}'"
|
||||
|
||||
@staticmethod
|
||||
async def async_validate_connection(
|
||||
hass: HomeAssistant, user_input: Dict[str, Any]
|
||||
) -> str | None:
|
||||
"""Validate connection to the Anthropic-compatible API."""
|
||||
api_key = user_input.get(CONF_API_KEY, "")
|
||||
base_url = user_input.get(CONF_BASE_URL, "")
|
||||
|
||||
if not api_key:
|
||||
return "API key is required"
|
||||
|
||||
if not base_url:
|
||||
return "Base URL is required"
|
||||
|
||||
try:
|
||||
kwargs: Dict[str, Any] = {
|
||||
"timeout": 10.0,
|
||||
"base_url": base_url,
|
||||
"api_key": "dummy-key-for-sdk",
|
||||
"default_headers": {
|
||||
"Authorization": api_key,
|
||||
"x-api-key": api_key,
|
||||
},
|
||||
}
|
||||
|
||||
# Create client in executor to avoid blocking SSL operations
|
||||
def create_client():
|
||||
return AsyncAnthropic(**kwargs)
|
||||
|
||||
client = await hass.async_add_executor_job(create_client)
|
||||
|
||||
# Fetch models to validate connection
|
||||
await client.models.list()
|
||||
return None
|
||||
except AuthenticationError as err:
|
||||
_LOGGER.error("Anthropic authentication error: %s", err)
|
||||
return f"Invalid API key: {err}"
|
||||
except APITimeoutError as err:
|
||||
_LOGGER.error("Anthropic timeout error: %s", err)
|
||||
return "Connection timed out"
|
||||
except APIConnectionError as err:
|
||||
_LOGGER.error("Anthropic connection error: %s", err)
|
||||
return f"Connection error: {err}"
|
||||
except APIError as err:
|
||||
_LOGGER.error("Anthropic API error: status=%s, message=%s", getattr(err, 'status_code', 'N/A'), err)
|
||||
return f"API error ({getattr(err, 'status_code', 'unknown')}): {err}"
|
||||
except Exception as err:
|
||||
_LOGGER.exception("Unexpected error validating Anthropic connection")
|
||||
return f"Unexpected error: {err}"
|
||||
|
||||
async def async_get_available_models(self) -> List[str]:
|
||||
"""Return available models from the API."""
|
||||
try:
|
||||
client = await self._async_build_client(timeout=10)
|
||||
response = await client.models.list()
|
||||
models = []
|
||||
for model in response.data:
|
||||
model_id = getattr(model, 'id', None)
|
||||
if model_id:
|
||||
models.append(model_id)
|
||||
if models:
|
||||
return models
|
||||
except Exception as err:
|
||||
_LOGGER.warning("Failed to fetch models from API: %s", err)
|
||||
|
||||
# Try fallback with aiohttp direct request
|
||||
try:
|
||||
headers = {
|
||||
"Authorization": self.api_key,
|
||||
"x-api-key": self.api_key,
|
||||
"Content-Type": "application/json",
|
||||
}
|
||||
|
||||
base = self.base_url.rstrip("/")
|
||||
path = self.api_path.strip("/")
|
||||
models_url = f"{base}/{path}/models"
|
||||
|
||||
async with aiohttp.ClientSession() as session:
|
||||
async with session.get(models_url, headers=headers, timeout=aiohttp.ClientTimeout(total=10)) as response:
|
||||
if response.status == 200:
|
||||
data = await response.json()
|
||||
models = []
|
||||
for model in data.get("data", []):
|
||||
model_id = model.get("id")
|
||||
if model_id:
|
||||
models.append(model_id)
|
||||
if models:
|
||||
return models
|
||||
except Exception as err:
|
||||
_LOGGER.debug("Fallback models fetch also failed: %s", err)
|
||||
|
||||
return []
|
||||
|
||||
def _supports_vision(self, entity_options: dict[str, Any]) -> bool:
|
||||
"""Anthropic models support vision."""
|
||||
return True
|
||||
|
||||
def _generate_stream(
|
||||
self,
|
||||
conversation: List[conversation.Content],
|
||||
llm_api: llm.APIInstance | None,
|
||||
agent_id: str,
|
||||
entity_options: dict[str, Any],
|
||||
) -> AsyncGenerator[TextGenerationResult, None]:
|
||||
"""Generate streaming response using Anthropic's Messages API."""
|
||||
|
||||
model_name = entity_options.get(CONF_CHAT_MODEL, "")
|
||||
max_tokens = int(entity_options.get(CONF_MAX_TOKENS, DEFAULT_MAX_TOKENS))
|
||||
temperature = entity_options.get(CONF_TEMPERATURE, DEFAULT_TEMPERATURE)
|
||||
top_p = entity_options.get(CONF_TOP_P, DEFAULT_TOP_P)
|
||||
top_k = entity_options.get(CONF_TOP_K, DEFAULT_TOP_K)
|
||||
timeout = entity_options.get(CONF_REQUEST_TIMEOUT, DEFAULT_REQUEST_TIMEOUT)
|
||||
enable_legacy_tool_calling = entity_options.get(
|
||||
CONF_ENABLE_LEGACY_TOOL_CALLING, DEFAULT_ENABLE_LEGACY_TOOL_CALLING
|
||||
)
|
||||
tool_response_as_string = entity_options.get(
|
||||
CONF_TOOL_RESPONSE_AS_STRING, DEFAULT_TOOL_RESPONSE_AS_STRING
|
||||
)
|
||||
|
||||
# Convert conversation to Anthropic format
|
||||
system_prompt, messages = _convert_to_anthropic_messages(
|
||||
conversation, tool_result_to_str=tool_response_as_string
|
||||
)
|
||||
|
||||
# Prepare tools if available and not using legacy tool calling
|
||||
tools = None
|
||||
if llm_api and not enable_legacy_tool_calling:
|
||||
tools = _convert_tools_to_anthropic_format(llm_api)
|
||||
|
||||
_LOGGER.debug(
|
||||
"Generating completion with model=%s, %d messages, and %d tools...",
|
||||
model_name,
|
||||
len(messages),
|
||||
len(tools) if tools else 0,
|
||||
)
|
||||
|
||||
async def anext_token() -> AsyncGenerator[Tuple[Optional[str], Optional[List[dict]]], None]:
|
||||
client = await self._async_build_client(timeout=timeout)
|
||||
|
||||
request_params: Dict[str, Any] = {
|
||||
"model": model_name,
|
||||
"max_tokens": max_tokens,
|
||||
"messages": messages,
|
||||
}
|
||||
|
||||
# Add optional parameters
|
||||
if system_prompt:
|
||||
request_params["system"] = system_prompt
|
||||
if tools:
|
||||
request_params["tools"] = tools
|
||||
if temperature is not None:
|
||||
request_params["temperature"] = temperature
|
||||
if top_p is not None:
|
||||
request_params["top_p"] = top_p
|
||||
if top_k is not None and top_k > 0:
|
||||
request_params["top_k"] = top_k
|
||||
|
||||
try:
|
||||
current_tool_call: Dict[str, Any] | None = None
|
||||
|
||||
async with client.messages.stream(**request_params) as stream:
|
||||
async for event in stream:
|
||||
event_type = getattr(event, 'type', None)
|
||||
|
||||
if event_type == "content_block_start":
|
||||
block = getattr(event, 'content_block', None)
|
||||
if block and getattr(block, 'type', None) == "tool_use":
|
||||
current_tool_call = {
|
||||
"id": getattr(block, 'id', ''),
|
||||
"name": getattr(block, 'name', ''),
|
||||
"input": "",
|
||||
}
|
||||
elif event_type == "content_block_delta":
|
||||
delta = getattr(event, 'delta', None)
|
||||
if delta:
|
||||
delta_type = getattr(delta, 'type', None)
|
||||
if delta_type == "text_delta":
|
||||
text = getattr(delta, 'text', '')
|
||||
if text:
|
||||
yield text, None
|
||||
elif delta_type == "input_json_delta":
|
||||
if current_tool_call:
|
||||
partial_json = getattr(delta, 'partial_json', '')
|
||||
current_tool_call["input"] += partial_json
|
||||
elif event_type == "content_block_stop":
|
||||
if current_tool_call:
|
||||
# Parse the accumulated JSON and yield the tool call
|
||||
try:
|
||||
tool_args = json.loads(current_tool_call["input"]) if current_tool_call["input"] else {}
|
||||
except json.JSONDecodeError:
|
||||
tool_args = {}
|
||||
|
||||
tool_call_dict = {
|
||||
"function": {
|
||||
"name": current_tool_call["name"],
|
||||
"arguments": tool_args,
|
||||
},
|
||||
"id": current_tool_call["id"],
|
||||
}
|
||||
yield None, [tool_call_dict]
|
||||
current_tool_call = None
|
||||
elif event_type == "message_stop":
|
||||
break
|
||||
|
||||
except APITimeoutError as err:
|
||||
raise HomeAssistantError(
|
||||
"The generation request timed out! Please check your connection "
|
||||
"settings, increase the timeout in settings, or decrease the "
|
||||
"number of exposed entities."
|
||||
) from err
|
||||
except APIConnectionError as err:
|
||||
raise HomeAssistantError(
|
||||
f"Failed to connect to the Anthropic-compatible API: {err}"
|
||||
) from err
|
||||
except APIError as err:
|
||||
raise HomeAssistantError(
|
||||
f"Anthropic API error: {err}"
|
||||
) from err
|
||||
|
||||
return self._async_stream_parse_completion(
|
||||
llm_api, agent_id, entity_options, anext_token=anext_token()
|
||||
)
|
||||
@@ -23,11 +23,12 @@ from custom_components.llama_conversation.const import (
|
||||
CONF_TEMPERATURE,
|
||||
CONF_TOP_P,
|
||||
CONF_REQUEST_TIMEOUT,
|
||||
CONF_OPENAI_API_KEY,
|
||||
CONF_API_KEY,
|
||||
CONF_REMEMBER_CONVERSATION,
|
||||
CONF_REMEMBER_CONVERSATION_TIME_MINUTES,
|
||||
CONF_GENERIC_OPENAI_PATH,
|
||||
CONF_API_PATH,
|
||||
CONF_ENABLE_LEGACY_TOOL_CALLING,
|
||||
CONF_TOOL_RESPONSE_AS_STRING,
|
||||
CONF_RESPONSE_JSON_SCHEMA,
|
||||
DEFAULT_MAX_TOKENS,
|
||||
DEFAULT_TEMPERATURE,
|
||||
@@ -35,8 +36,9 @@ from custom_components.llama_conversation.const import (
|
||||
DEFAULT_REQUEST_TIMEOUT,
|
||||
DEFAULT_REMEMBER_CONVERSATION,
|
||||
DEFAULT_REMEMBER_CONVERSATION_TIME_MINUTES,
|
||||
DEFAULT_GENERIC_OPENAI_PATH,
|
||||
DEFAULT_API_PATH,
|
||||
DEFAULT_ENABLE_LEGACY_TOOL_CALLING,
|
||||
DEFAULT_TOOL_RESPONSE_AS_STRING,
|
||||
RECOMMENDED_CHAT_MODELS,
|
||||
)
|
||||
from custom_components.llama_conversation.entity import TextGenerationResult, LocalLLMClient
|
||||
@@ -57,24 +59,24 @@ class GenericOpenAIAPIClient(LocalLLMClient):
|
||||
hostname=client_options[CONF_HOST],
|
||||
port=client_options[CONF_PORT],
|
||||
ssl=client_options[CONF_SSL],
|
||||
path="/" + client_options.get(CONF_GENERIC_OPENAI_PATH, DEFAULT_GENERIC_OPENAI_PATH)
|
||||
path="/" + client_options.get(CONF_API_PATH, DEFAULT_API_PATH)
|
||||
)
|
||||
|
||||
self.api_key = client_options.get(CONF_OPENAI_API_KEY, "")
|
||||
self.api_key = client_options.get(CONF_API_KEY, "")
|
||||
|
||||
@staticmethod
|
||||
def get_name(client_options: dict[str, Any]):
|
||||
host = client_options[CONF_HOST]
|
||||
port = client_options[CONF_PORT]
|
||||
ssl = client_options[CONF_SSL]
|
||||
path = "/" + client_options[CONF_GENERIC_OPENAI_PATH]
|
||||
path = "/" + client_options[CONF_API_PATH]
|
||||
return f"Generic OpenAI at '{format_url(hostname=host, port=port, ssl=ssl, path=path)}'"
|
||||
|
||||
@staticmethod
|
||||
async def async_validate_connection(hass: HomeAssistant, user_input: Dict[str, Any]) -> str | None:
|
||||
headers = {}
|
||||
api_key = user_input.get(CONF_OPENAI_API_KEY)
|
||||
api_base_path = user_input.get(CONF_GENERIC_OPENAI_PATH, DEFAULT_GENERIC_OPENAI_PATH)
|
||||
api_key = user_input.get(CONF_API_KEY)
|
||||
api_base_path = user_input.get(CONF_API_PATH, DEFAULT_API_PATH)
|
||||
if api_key:
|
||||
headers["Authorization"] = f"Bearer {api_key}"
|
||||
|
||||
@@ -126,15 +128,18 @@ class GenericOpenAIAPIClient(LocalLLMClient):
|
||||
model_name = entity_options[CONF_CHAT_MODEL]
|
||||
temperature = entity_options.get(CONF_TEMPERATURE, DEFAULT_TEMPERATURE)
|
||||
top_p = entity_options.get(CONF_TOP_P, DEFAULT_TOP_P)
|
||||
max_tokens = entity_options.get(CONF_MAX_TOKENS, DEFAULT_MAX_TOKENS)
|
||||
timeout = entity_options.get(CONF_REQUEST_TIMEOUT, DEFAULT_REQUEST_TIMEOUT)
|
||||
enable_legacy_tool_calling = entity_options.get(CONF_ENABLE_LEGACY_TOOL_CALLING, DEFAULT_ENABLE_LEGACY_TOOL_CALLING)
|
||||
tool_response_as_string = entity_options.get(CONF_TOOL_RESPONSE_AS_STRING, DEFAULT_TOOL_RESPONSE_AS_STRING)
|
||||
|
||||
endpoint, additional_params = self._chat_completion_params(entity_options)
|
||||
messages = get_oai_formatted_messages(conversation, user_content_as_list=True)
|
||||
messages = get_oai_formatted_messages(conversation, user_content_as_list=True, tool_result_to_str=tool_response_as_string)
|
||||
|
||||
request_params = {
|
||||
"model": model_name,
|
||||
"stream": True,
|
||||
"max_tokens": max_tokens,
|
||||
"temperature": temperature,
|
||||
"top_p": top_p,
|
||||
"messages": messages
|
||||
@@ -152,8 +157,6 @@ class GenericOpenAIAPIClient(LocalLLMClient):
|
||||
}
|
||||
|
||||
tools = None
|
||||
# "legacy" tool calling passes the tools directly as part of the system prompt instead of as "tools"
|
||||
# most local backends absolutely butcher any sort of prompt formatting when using tool calling
|
||||
if llm_api and not enable_legacy_tool_calling:
|
||||
tools = get_oai_formatted_tools(llm_api, self._async_get_all_exposed_domains())
|
||||
request_params["tools"] = tools
|
||||
@@ -248,17 +251,17 @@ class GenericOpenAIResponsesAPIClient(LocalLLMClient):
|
||||
hostname=client_options[CONF_HOST],
|
||||
port=client_options[CONF_PORT],
|
||||
ssl=client_options[CONF_SSL],
|
||||
path="/" + client_options.get(CONF_GENERIC_OPENAI_PATH, DEFAULT_GENERIC_OPENAI_PATH)
|
||||
path="/" + client_options.get(CONF_API_PATH, DEFAULT_API_PATH)
|
||||
)
|
||||
|
||||
self.api_key = client_options.get(CONF_OPENAI_API_KEY, "")
|
||||
self.api_key = client_options.get(CONF_API_KEY, "")
|
||||
|
||||
@staticmethod
|
||||
def get_name(client_options: dict[str, Any]):
|
||||
host = client_options[CONF_HOST]
|
||||
port = client_options[CONF_PORT]
|
||||
ssl = client_options[CONF_SSL]
|
||||
path = "/" + client_options[CONF_GENERIC_OPENAI_PATH]
|
||||
path = "/" + client_options[CONF_API_PATH]
|
||||
return f"Generic OpenAI at '{format_url(hostname=host, port=port, ssl=ssl, path=path)}'"
|
||||
|
||||
def _responses_params(self, conversation: List[conversation.Content], entity_options: Dict[str, Any]) -> Tuple[str, Dict[str, Any]]:
|
||||
|
||||
@@ -19,6 +19,8 @@ from homeassistant.helpers.event import async_track_state_change, async_call_lat
|
||||
|
||||
from custom_components.llama_conversation.utils import install_llama_cpp_python, validate_llama_cpp_python_installation, get_oai_formatted_messages, get_oai_formatted_tools
|
||||
from custom_components.llama_conversation.const import (
|
||||
CONF_ENABLE_LEGACY_TOOL_CALLING,
|
||||
CONF_TOOL_RESPONSE_AS_STRING,
|
||||
CONF_INSTALLED_LLAMACPP_VERSION,
|
||||
CONF_CHAT_MODEL,
|
||||
CONF_MAX_TOKENS,
|
||||
@@ -38,7 +40,10 @@ from custom_components.llama_conversation.const import (
|
||||
CONF_LLAMACPP_BATCH_SIZE,
|
||||
CONF_LLAMACPP_THREAD_COUNT,
|
||||
CONF_LLAMACPP_BATCH_THREAD_COUNT,
|
||||
CONF_LLAMACPP_CACHE_SIZE_MB,
|
||||
CONF_INSTALLED_LLAMACPP_VERSION,
|
||||
DEFAULT_ENABLE_LEGACY_TOOL_CALLING,
|
||||
DEFAULT_TOOL_RESPONSE_AS_STRING,
|
||||
DEFAULT_MAX_TOKENS,
|
||||
DEFAULT_PROMPT,
|
||||
DEFAULT_TEMPERATURE,
|
||||
@@ -55,6 +60,7 @@ from custom_components.llama_conversation.const import (
|
||||
DEFAULT_LLAMACPP_BATCH_SIZE,
|
||||
DEFAULT_LLAMACPP_THREAD_COUNT,
|
||||
DEFAULT_LLAMACPP_BATCH_THREAD_COUNT,
|
||||
DEFAULT_LLAMACPP_CACHE_SIZE_MB,
|
||||
DOMAIN,
|
||||
CONF_RESPONSE_JSON_SCHEMA,
|
||||
)
|
||||
@@ -67,6 +73,7 @@ if TYPE_CHECKING:
|
||||
from llama_cpp import (
|
||||
Llama as LlamaType,
|
||||
LlamaGrammar as LlamaGrammarType,
|
||||
LlamaDiskCache as LlamaDiskCacheType,
|
||||
ChatCompletionRequestResponseFormat
|
||||
)
|
||||
else:
|
||||
@@ -83,6 +90,7 @@ def snapshot_settings(options: dict[str, Any]) -> dict[str, Any]:
|
||||
CONF_LLAMACPP_BATCH_SIZE: options.get(CONF_LLAMACPP_BATCH_SIZE, DEFAULT_LLAMACPP_BATCH_SIZE),
|
||||
CONF_LLAMACPP_THREAD_COUNT: options.get(CONF_LLAMACPP_THREAD_COUNT, DEFAULT_LLAMACPP_THREAD_COUNT),
|
||||
CONF_LLAMACPP_BATCH_THREAD_COUNT: options.get(CONF_LLAMACPP_BATCH_THREAD_COUNT, DEFAULT_LLAMACPP_BATCH_THREAD_COUNT),
|
||||
CONF_LLAMACPP_CACHE_SIZE_MB: options.get(CONF_LLAMACPP_CACHE_SIZE_MB, DEFAULT_LLAMACPP_CACHE_SIZE_MB),
|
||||
CONF_LLAMACPP_ENABLE_FLASH_ATTENTION: options.get(CONF_LLAMACPP_ENABLE_FLASH_ATTENTION, DEFAULT_LLAMACPP_ENABLE_FLASH_ATTENTION),
|
||||
CONF_INSTALLED_LLAMACPP_VERSION: options.get(CONF_INSTALLED_LLAMACPP_VERSION, ""),
|
||||
CONF_GBNF_GRAMMAR_FILE: options.get(CONF_GBNF_GRAMMAR_FILE, DEFAULT_GBNF_GRAMMAR_FILE),
|
||||
@@ -156,6 +164,7 @@ class LlamaCppClient(LocalLLMClient):
|
||||
self.llama_cpp_module = importlib.import_module("llama_cpp")
|
||||
|
||||
Llama: type[LlamaType] = getattr(self.llama_cpp_module, "Llama")
|
||||
LlamaDiskCache: type[LlamaDiskCacheType] = getattr(self.llama_cpp_module, "LlamaDiskCache")
|
||||
|
||||
_LOGGER.debug(f"Loading model '{model_path}'...")
|
||||
model_settings = snapshot_settings(entity_options)
|
||||
@@ -170,11 +179,15 @@ class LlamaCppClient(LocalLLMClient):
|
||||
)
|
||||
_LOGGER.debug("Model loaded")
|
||||
|
||||
# TODO: check about disk caching
|
||||
# self.llm.set_cache(self.llama_cpp_module.LlamaDiskCache(
|
||||
# capacity_bytes=(512 * 10e8),
|
||||
# cache_dir=os.path.join(self.hass.config.media_dirs.get("local", self.hass.config.path("media")), "kv_cache")
|
||||
# ))
|
||||
# create disk cache if enabled
|
||||
# cache must be per-model to avoid conflicts with different hidden state sizes
|
||||
cache_size = model_settings.get(CONF_LLAMACPP_CACHE_SIZE_MB, DEFAULT_LLAMACPP_CACHE_SIZE_MB)
|
||||
cache_dir = model_name.strip().replace(" ", "_").lower()
|
||||
if cache_size > 0:
|
||||
llm.set_cache(LlamaDiskCache(
|
||||
capacity_bytes=int(cache_size * (1024 ** 2)), # MB to bytes
|
||||
cache_dir=os.path.join(self.hass.config.media_dirs.get("local", self.hass.config.path("media")), "kv_cache", cache_dir)
|
||||
))
|
||||
|
||||
if model_settings[CONF_PROMPT_CACHING_ENABLED]:
|
||||
@callback
|
||||
@@ -222,6 +235,8 @@ class LlamaCppClient(LocalLLMClient):
|
||||
should_reload = True
|
||||
elif loaded_options[CONF_LLAMACPP_ENABLE_FLASH_ATTENTION] != entity_options.get(CONF_LLAMACPP_ENABLE_FLASH_ATTENTION, DEFAULT_LLAMACPP_ENABLE_FLASH_ATTENTION):
|
||||
should_reload = True
|
||||
elif loaded_options[CONF_LLAMACPP_CACHE_SIZE_MB] != entity_options.get(CONF_LLAMACPP_CACHE_SIZE_MB, DEFAULT_LLAMACPP_CACHE_SIZE_MB):
|
||||
should_reload = True
|
||||
elif loaded_options[CONF_INSTALLED_LLAMACPP_VERSION] != entity_options.get(CONF_INSTALLED_LLAMACPP_VERSION):
|
||||
should_reload = True
|
||||
_LOGGER.debug(f"Reloading llama.cpp...")
|
||||
@@ -393,6 +408,7 @@ class LlamaCppClient(LocalLLMClient):
|
||||
max_tokens=1,
|
||||
grammar=grammar,
|
||||
stream=False,
|
||||
# stop=["<end_of_turn>", "<end_function_call>"]
|
||||
)
|
||||
|
||||
self.last_cache_prime = time.time()
|
||||
@@ -434,12 +450,14 @@ class LlamaCppClient(LocalLLMClient):
|
||||
min_p = entity_options.get(CONF_MIN_P, DEFAULT_MIN_P)
|
||||
typical_p = entity_options.get(CONF_TYPICAL_P, DEFAULT_TYPICAL_P)
|
||||
grammar = self.grammars.get(model_name) if entity_options.get(CONF_USE_GBNF_GRAMMAR, DEFAULT_USE_GBNF_GRAMMAR) else None
|
||||
enable_legacy_tool_calling = entity_options.get(CONF_ENABLE_LEGACY_TOOL_CALLING, DEFAULT_ENABLE_LEGACY_TOOL_CALLING)
|
||||
tool_response_as_string = entity_options.get(CONF_TOOL_RESPONSE_AS_STRING, DEFAULT_TOOL_RESPONSE_AS_STRING)
|
||||
|
||||
_LOGGER.debug(f"Options: {entity_options}")
|
||||
|
||||
messages = get_oai_formatted_messages(conversation)
|
||||
messages = get_oai_formatted_messages(conversation, tool_result_to_str=tool_response_as_string)
|
||||
tools = None
|
||||
if llm_api:
|
||||
if llm_api and not enable_legacy_tool_calling:
|
||||
tools = get_oai_formatted_tools(llm_api, self._async_get_all_exposed_domains())
|
||||
|
||||
_LOGGER.debug(f"Generating completion with {len(messages)} messages and {len(tools) if tools else 0} tools...")
|
||||
@@ -464,6 +482,7 @@ class LlamaCppClient(LocalLLMClient):
|
||||
grammar=grammar,
|
||||
stream=True,
|
||||
response_format=response_format,
|
||||
# stop=["<end_of_turn>", "<end_function_call>"] # FIXME: make configurable (pull from tool end token?)
|
||||
)
|
||||
|
||||
def next_token() -> Generator[tuple[Optional[str], Optional[List]]]:
|
||||
|
||||
@@ -27,12 +27,13 @@ from custom_components.llama_conversation.const import (
|
||||
CONF_MIN_P,
|
||||
CONF_ENABLE_THINK_MODE,
|
||||
CONF_REQUEST_TIMEOUT,
|
||||
CONF_OPENAI_API_KEY,
|
||||
CONF_GENERIC_OPENAI_PATH,
|
||||
CONF_API_KEY,
|
||||
CONF_API_PATH,
|
||||
CONF_OLLAMA_KEEP_ALIVE_MIN,
|
||||
CONF_OLLAMA_JSON_MODE,
|
||||
CONF_CONTEXT_LENGTH,
|
||||
CONF_ENABLE_LEGACY_TOOL_CALLING,
|
||||
CONF_TOOL_RESPONSE_AS_STRING,
|
||||
CONF_RESPONSE_JSON_SCHEMA,
|
||||
DEFAULT_MAX_TOKENS,
|
||||
DEFAULT_TEMPERATURE,
|
||||
@@ -42,11 +43,12 @@ from custom_components.llama_conversation.const import (
|
||||
DEFAULT_MIN_P,
|
||||
DEFAULT_ENABLE_THINK_MODE,
|
||||
DEFAULT_REQUEST_TIMEOUT,
|
||||
DEFAULT_GENERIC_OPENAI_PATH,
|
||||
DEFAULT_API_PATH,
|
||||
DEFAULT_OLLAMA_KEEP_ALIVE_MIN,
|
||||
DEFAULT_OLLAMA_JSON_MODE,
|
||||
DEFAULT_CONTEXT_LENGTH,
|
||||
DEFAULT_ENABLE_LEGACY_TOOL_CALLING,
|
||||
DEFAULT_TOOL_RESPONSE_AS_STRING,
|
||||
)
|
||||
|
||||
from custom_components.llama_conversation.entity import LocalLLMClient, TextGenerationResult
|
||||
@@ -75,14 +77,14 @@ class OllamaAPIClient(LocalLLMClient):
|
||||
|
||||
def __init__(self, hass: HomeAssistant, client_options: dict[str, Any]) -> None:
|
||||
super().__init__(hass, client_options)
|
||||
base_path = _normalize_path(client_options.get(CONF_GENERIC_OPENAI_PATH, DEFAULT_GENERIC_OPENAI_PATH))
|
||||
base_path = _normalize_path(client_options.get(CONF_API_PATH, DEFAULT_API_PATH))
|
||||
self.api_host = format_url(
|
||||
hostname=client_options[CONF_HOST],
|
||||
port=client_options[CONF_PORT],
|
||||
ssl=client_options[CONF_SSL],
|
||||
path=base_path,
|
||||
)
|
||||
self.api_key = client_options.get(CONF_OPENAI_API_KEY) or None
|
||||
self.api_key = client_options.get(CONF_API_KEY) or None
|
||||
self._headers = {"Authorization": f"Bearer {self.api_key}"} if self.api_key else None
|
||||
self._ssl_context = _build_default_ssl_context() if client_options.get(CONF_SSL) else None
|
||||
|
||||
@@ -103,13 +105,13 @@ class OllamaAPIClient(LocalLLMClient):
|
||||
host = client_options[CONF_HOST]
|
||||
port = client_options[CONF_PORT]
|
||||
ssl = client_options[CONF_SSL]
|
||||
path = _normalize_path(client_options.get(CONF_GENERIC_OPENAI_PATH, DEFAULT_GENERIC_OPENAI_PATH))
|
||||
path = _normalize_path(client_options.get(CONF_API_PATH, DEFAULT_API_PATH))
|
||||
return f"Ollama at '{format_url(hostname=host, port=port, ssl=ssl, path=path)}'"
|
||||
|
||||
@staticmethod
|
||||
async def async_validate_connection(hass: HomeAssistant, user_input: Dict[str, Any]) -> str | None:
|
||||
api_key = user_input.get(CONF_OPENAI_API_KEY)
|
||||
base_path = _normalize_path(user_input.get(CONF_GENERIC_OPENAI_PATH, DEFAULT_GENERIC_OPENAI_PATH))
|
||||
api_key = user_input.get(CONF_API_KEY)
|
||||
base_path = _normalize_path(user_input.get(CONF_API_PATH, DEFAULT_API_PATH))
|
||||
timeout_config: httpx.Timeout | float | None = httpx.Timeout(5)
|
||||
|
||||
verify_context = None
|
||||
@@ -194,7 +196,8 @@ class OllamaAPIClient(LocalLLMClient):
|
||||
typical_p = entity_options.get(CONF_TYPICAL_P, DEFAULT_TYPICAL_P)
|
||||
timeout = entity_options.get(CONF_REQUEST_TIMEOUT, DEFAULT_REQUEST_TIMEOUT)
|
||||
keep_alive = entity_options.get(CONF_OLLAMA_KEEP_ALIVE_MIN, DEFAULT_OLLAMA_KEEP_ALIVE_MIN)
|
||||
legacy_tool_calling = entity_options.get(CONF_ENABLE_LEGACY_TOOL_CALLING, DEFAULT_ENABLE_LEGACY_TOOL_CALLING)
|
||||
enable_legacy_tool_calling = entity_options.get(CONF_ENABLE_LEGACY_TOOL_CALLING, DEFAULT_ENABLE_LEGACY_TOOL_CALLING)
|
||||
tool_response_as_string = entity_options.get(CONF_TOOL_RESPONSE_AS_STRING, DEFAULT_TOOL_RESPONSE_AS_STRING)
|
||||
think_mode = entity_options.get(CONF_ENABLE_THINK_MODE, DEFAULT_ENABLE_THINK_MODE)
|
||||
json_mode = entity_options.get(CONF_OLLAMA_JSON_MODE, DEFAULT_OLLAMA_JSON_MODE)
|
||||
|
||||
@@ -208,9 +211,9 @@ class OllamaAPIClient(LocalLLMClient):
|
||||
"min_p": entity_options.get(CONF_MIN_P, DEFAULT_MIN_P),
|
||||
}
|
||||
|
||||
messages = get_oai_formatted_messages(conversation, tool_args_to_str=False)
|
||||
messages = get_oai_formatted_messages(conversation, tool_args_to_str=False, tool_result_to_str=tool_response_as_string)
|
||||
tools = None
|
||||
if llm_api and not legacy_tool_calling:
|
||||
if llm_api and not enable_legacy_tool_calling:
|
||||
tools = get_oai_formatted_tools(llm_api, self._async_get_all_exposed_domains())
|
||||
keep_alive_payload = self._format_keep_alive(keep_alive)
|
||||
|
||||
|
||||
@@ -22,7 +22,7 @@ from custom_components.llama_conversation.const import (
|
||||
CONF_TEXT_GEN_WEBUI_ADMIN_KEY,
|
||||
CONF_TEXT_GEN_WEBUI_CHAT_MODE,
|
||||
CONF_CONTEXT_LENGTH,
|
||||
CONF_GENERIC_OPENAI_PATH,
|
||||
CONF_API_PATH,
|
||||
DEFAULT_MAX_TOKENS,
|
||||
DEFAULT_TOP_K,
|
||||
DEFAULT_MIN_P,
|
||||
@@ -53,7 +53,7 @@ class TextGenerationWebuiClient(GenericOpenAIAPIClient):
|
||||
host = client_options[CONF_HOST]
|
||||
port = client_options[CONF_PORT]
|
||||
ssl = client_options[CONF_SSL]
|
||||
path = "/" + client_options[CONF_GENERIC_OPENAI_PATH]
|
||||
path = "/" + client_options[CONF_API_PATH]
|
||||
return f"Text-Gen WebUI at '{format_url(hostname=host, port=port, ssl=ssl, path=path)}'"
|
||||
|
||||
async def _async_load_model(self, entity_options: dict[str, Any]) -> None:
|
||||
@@ -126,7 +126,7 @@ class LlamaCppServerClient(GenericOpenAIAPIClient):
|
||||
host = client_options[CONF_HOST]
|
||||
port = client_options[CONF_PORT]
|
||||
ssl = client_options[CONF_SSL]
|
||||
path = "/" + client_options[CONF_GENERIC_OPENAI_PATH]
|
||||
path = "/" + client_options[CONF_API_PATH]
|
||||
return f"Llama.cpp Server at '{format_url(hostname=host, port=port, ssl=ssl, path=path)}'"
|
||||
|
||||
def _chat_completion_params(self, entity_options: Dict[str, Any]) -> Tuple[str, Dict[str, Any]]:
|
||||
|
||||
@@ -70,6 +70,7 @@ from .const import (
|
||||
CONF_TOOL_CALL_PREFIX,
|
||||
CONF_TOOL_CALL_SUFFIX,
|
||||
CONF_ENABLE_LEGACY_TOOL_CALLING,
|
||||
CONF_TOOL_RESPONSE_AS_STRING,
|
||||
CONF_LLAMACPP_ENABLE_FLASH_ATTENTION,
|
||||
CONF_USE_GBNF_GRAMMAR,
|
||||
CONF_GBNF_GRAMMAR_FILE,
|
||||
@@ -85,17 +86,18 @@ from .const import (
|
||||
CONF_USE_IN_CONTEXT_LEARNING_EXAMPLES,
|
||||
CONF_IN_CONTEXT_EXAMPLES_FILE,
|
||||
CONF_NUM_IN_CONTEXT_EXAMPLES,
|
||||
CONF_OPENAI_API_KEY,
|
||||
CONF_API_KEY,
|
||||
CONF_TEXT_GEN_WEBUI_ADMIN_KEY,
|
||||
CONF_TEXT_GEN_WEBUI_CHAT_MODE,
|
||||
CONF_OLLAMA_KEEP_ALIVE_MIN,
|
||||
CONF_OLLAMA_JSON_MODE,
|
||||
CONF_GENERIC_OPENAI_PATH,
|
||||
CONF_API_PATH,
|
||||
CONF_CONTEXT_LENGTH,
|
||||
CONF_LLAMACPP_BATCH_SIZE,
|
||||
CONF_LLAMACPP_THREAD_COUNT,
|
||||
CONF_LLAMACPP_BATCH_THREAD_COUNT,
|
||||
CONF_LLAMACPP_REINSTALL,
|
||||
CONF_LLAMACPP_CACHE_SIZE_MB,
|
||||
DEFAULT_CHAT_MODEL,
|
||||
DEFAULT_PORT,
|
||||
DEFAULT_SSL,
|
||||
@@ -121,6 +123,7 @@ from .const import (
|
||||
DEFAULT_TOOL_CALL_PREFIX,
|
||||
DEFAULT_TOOL_CALL_SUFFIX,
|
||||
DEFAULT_ENABLE_LEGACY_TOOL_CALLING,
|
||||
DEFAULT_TOOL_RESPONSE_AS_STRING,
|
||||
DEFAULT_LLAMACPP_ENABLE_FLASH_ATTENTION,
|
||||
DEFAULT_USE_GBNF_GRAMMAR,
|
||||
DEFAULT_GBNF_GRAMMAR_FILE,
|
||||
@@ -137,17 +140,20 @@ from .const import (
|
||||
DEFAULT_TEXT_GEN_WEBUI_CHAT_MODE,
|
||||
DEFAULT_OLLAMA_KEEP_ALIVE_MIN,
|
||||
DEFAULT_OLLAMA_JSON_MODE,
|
||||
DEFAULT_GENERIC_OPENAI_PATH,
|
||||
DEFAULT_API_PATH,
|
||||
DEFAULT_CONTEXT_LENGTH,
|
||||
DEFAULT_LLAMACPP_BATCH_SIZE,
|
||||
DEFAULT_LLAMACPP_THREAD_COUNT,
|
||||
DEFAULT_LLAMACPP_BATCH_THREAD_COUNT,
|
||||
DEFAULT_LLAMACPP_CACHE_SIZE_MB,
|
||||
BACKEND_TYPE_LLAMA_CPP,
|
||||
BACKEND_TYPE_TEXT_GEN_WEBUI,
|
||||
BACKEND_TYPE_GENERIC_OPENAI,
|
||||
BACKEND_TYPE_GENERIC_OPENAI_RESPONSES,
|
||||
BACKEND_TYPE_LLAMA_CPP_SERVER,
|
||||
BACKEND_TYPE_OLLAMA,
|
||||
BACKEND_TYPE_ANTHROPIC,
|
||||
CONF_BASE_URL,
|
||||
TEXT_GEN_WEBUI_CHAT_MODE_CHAT,
|
||||
TEXT_GEN_WEBUI_CHAT_MODE_INSTRUCT,
|
||||
TEXT_GEN_WEBUI_CHAT_MODE_CHAT_INSTRUCT,
|
||||
@@ -182,7 +188,8 @@ def pick_backend_schema(backend_type=None, selected_language=None):
|
||||
BACKEND_TYPE_GENERIC_OPENAI,
|
||||
BACKEND_TYPE_GENERIC_OPENAI_RESPONSES,
|
||||
BACKEND_TYPE_LLAMA_CPP_SERVER,
|
||||
BACKEND_TYPE_OLLAMA
|
||||
BACKEND_TYPE_OLLAMA,
|
||||
BACKEND_TYPE_ANTHROPIC,
|
||||
],
|
||||
translation_key=CONF_BACKEND_TYPE,
|
||||
multiple=False,
|
||||
@@ -197,11 +204,22 @@ def pick_backend_schema(backend_type=None, selected_language=None):
|
||||
}
|
||||
)
|
||||
|
||||
def remote_connection_schema(backend_type: str, *, host=None, port=None, ssl=None, selected_path=None):
|
||||
def remote_connection_schema(backend_type: str, *, host=None, port=None, ssl=None, selected_path=None, api_key=None, base_url=None):
|
||||
|
||||
extra = {}
|
||||
default_port = DEFAULT_PORT
|
||||
default_path = DEFAULT_GENERIC_OPENAI_PATH
|
||||
default_path = DEFAULT_API_PATH
|
||||
|
||||
# Anthropic uses a different schema - base URL + API key only (no host/port/ssl)
|
||||
if backend_type == BACKEND_TYPE_ANTHROPIC:
|
||||
return vol.Schema({
|
||||
vol.Required(CONF_BASE_URL, default=base_url if base_url else ""): TextSelector(
|
||||
TextSelectorConfig()
|
||||
),
|
||||
vol.Required(CONF_API_KEY, default=api_key if api_key else ""): TextSelector(
|
||||
TextSelectorConfig(type=TextSelectorType.PASSWORD)
|
||||
),
|
||||
})
|
||||
|
||||
if backend_type == BACKEND_TYPE_TEXT_GEN_WEBUI:
|
||||
extra[vol.Optional(CONF_TEXT_GEN_WEBUI_ADMIN_KEY)] = TextSelector(TextSelectorConfig(type=TextSelectorType.PASSWORD))
|
||||
@@ -218,9 +236,9 @@ def remote_connection_schema(backend_type: str, *, host=None, port=None, ssl=Non
|
||||
vol.Required(CONF_HOST, default=host if host else ""): str,
|
||||
vol.Optional(CONF_PORT, default=port if port else default_port): str,
|
||||
vol.Required(CONF_SSL, default=ssl if ssl else DEFAULT_SSL): bool,
|
||||
vol.Optional(CONF_OPENAI_API_KEY): TextSelector(TextSelectorConfig(type=TextSelectorType.PASSWORD)),
|
||||
vol.Optional(CONF_API_KEY): TextSelector(TextSelectorConfig(type=TextSelectorType.PASSWORD)),
|
||||
vol.Optional(
|
||||
CONF_GENERIC_OPENAI_PATH,
|
||||
CONF_API_PATH,
|
||||
default=selected_path if selected_path else default_path
|
||||
): TextSelector(TextSelectorConfig(prefix="/")),
|
||||
**extra
|
||||
@@ -293,8 +311,9 @@ class ConfigFlow(BaseConfigFlow, domain=DOMAIN):
|
||||
)
|
||||
else:
|
||||
self.internal_step = "configure_connection"
|
||||
schema = remote_connection_schema(self.client_config[CONF_BACKEND_TYPE])
|
||||
return self.async_show_form(
|
||||
step_id="user", data_schema=remote_connection_schema(self.client_config[CONF_BACKEND_TYPE]), last_step=True
|
||||
step_id="user", data_schema=schema, last_step=True
|
||||
)
|
||||
elif self.install_wheel_error:
|
||||
errors["base"] = str(self.install_wheel_error)
|
||||
@@ -335,31 +354,46 @@ class ConfigFlow(BaseConfigFlow, domain=DOMAIN):
|
||||
self.internal_step = next_step
|
||||
return self.async_show_progress_done(next_step_id="finish")
|
||||
elif self.internal_step == "configure_connection":
|
||||
backend = self.client_config[CONF_BACKEND_TYPE]
|
||||
if user_input:
|
||||
self.client_config.update(user_input)
|
||||
|
||||
hostname = user_input.get(CONF_HOST, "")
|
||||
if not is_valid_hostname(hostname):
|
||||
errors["base"] = "invalid_hostname"
|
||||
else:
|
||||
# validate remote connections
|
||||
connect_err = await BACKEND_TO_CLS[self.client_config[CONF_BACKEND_TYPE]].async_validate_connection(self.hass, self.client_config)
|
||||
|
||||
# Anthropic doesn't use hostname - skip hostname validation
|
||||
if backend == BACKEND_TYPE_ANTHROPIC:
|
||||
connect_err = await BACKEND_TO_CLS[backend].async_validate_connection(self.hass, self.client_config)
|
||||
if connect_err:
|
||||
errors["base"] = "failed_to_connect"
|
||||
description_placeholders["exception"] = str(connect_err)
|
||||
else:
|
||||
return await self.async_step_finish()
|
||||
|
||||
else:
|
||||
hostname = user_input.get(CONF_HOST, "")
|
||||
if not is_valid_hostname(hostname):
|
||||
errors["base"] = "invalid_hostname"
|
||||
else:
|
||||
# validate remote connections
|
||||
connect_err = await BACKEND_TO_CLS[backend].async_validate_connection(self.hass, self.client_config)
|
||||
|
||||
if connect_err:
|
||||
errors["base"] = "failed_to_connect"
|
||||
description_placeholders["exception"] = str(connect_err)
|
||||
else:
|
||||
return await self.async_step_finish()
|
||||
|
||||
# Use appropriate schema for the backend type
|
||||
schema = remote_connection_schema(
|
||||
backend,
|
||||
host=self.client_config.get(CONF_HOST),
|
||||
port=self.client_config.get(CONF_PORT),
|
||||
ssl=self.client_config.get(CONF_SSL),
|
||||
selected_path=self.client_config.get(CONF_API_PATH),
|
||||
api_key=self.client_config.get(CONF_API_KEY),
|
||||
base_url=self.client_config.get(CONF_BASE_URL),
|
||||
)
|
||||
|
||||
return self.async_show_form(
|
||||
step_id="user",
|
||||
data_schema=remote_connection_schema(
|
||||
self.client_config[CONF_BACKEND_TYPE],
|
||||
host=self.client_config.get(CONF_HOST),
|
||||
port=self.client_config.get(CONF_PORT),
|
||||
ssl=self.client_config.get(CONF_SSL),
|
||||
selected_path=self.client_config.get(CONF_GENERIC_OPENAI_PATH)
|
||||
),
|
||||
step_id="user",
|
||||
data_schema=schema,
|
||||
errors=errors,
|
||||
description_placeholders=description_placeholders,
|
||||
last_step=True
|
||||
@@ -473,7 +507,9 @@ class OptionsFlow(BaseOptionsFlow):
|
||||
host=client_config.get(CONF_HOST),
|
||||
port=client_config.get(CONF_PORT),
|
||||
ssl=client_config.get(CONF_SSL),
|
||||
selected_path=client_config.get(CONF_GENERIC_OPENAI_PATH)
|
||||
selected_path=client_config.get(CONF_API_PATH),
|
||||
api_key=client_config.get(CONF_API_KEY),
|
||||
base_url=client_config.get(CONF_BASE_URL),
|
||||
)
|
||||
|
||||
return self.async_show_form(
|
||||
@@ -621,6 +657,11 @@ def local_llama_config_option_schema(
|
||||
description={"suggested_value": options.get(CONF_ENABLE_LEGACY_TOOL_CALLING)},
|
||||
default=DEFAULT_ENABLE_LEGACY_TOOL_CALLING
|
||||
): bool,
|
||||
vol.Required(
|
||||
CONF_TOOL_RESPONSE_AS_STRING,
|
||||
description={"suggested_value": options.get(CONF_TOOL_RESPONSE_AS_STRING)},
|
||||
default=DEFAULT_TOOL_RESPONSE_AS_STRING
|
||||
): bool,
|
||||
}
|
||||
|
||||
if subentry_type == ai_task.DOMAIN:
|
||||
@@ -727,7 +768,7 @@ def local_llama_config_option_schema(
|
||||
CONF_PROMPT_CACHING_INTERVAL,
|
||||
description={"suggested_value": options.get(CONF_PROMPT_CACHING_INTERVAL)},
|
||||
default=DEFAULT_PROMPT_CACHING_INTERVAL,
|
||||
): NumberSelector(NumberSelectorConfig(min=1, max=60, step=1)),
|
||||
): NumberSelector(NumberSelectorConfig(min=1, max=60, step=1))
|
||||
})
|
||||
result.update({
|
||||
vol.Required(
|
||||
@@ -781,6 +822,11 @@ def local_llama_config_option_schema(
|
||||
description={"suggested_value": options.get(CONF_LLAMACPP_ENABLE_FLASH_ATTENTION)},
|
||||
default=DEFAULT_LLAMACPP_ENABLE_FLASH_ATTENTION,
|
||||
): BooleanSelector(BooleanSelectorConfig()),
|
||||
vol.Required(
|
||||
CONF_LLAMACPP_CACHE_SIZE_MB,
|
||||
description={"suggested_value": options.get(CONF_LLAMACPP_CACHE_SIZE_MB)},
|
||||
default=DEFAULT_LLAMACPP_CACHE_SIZE_MB,
|
||||
): NumberSelector(NumberSelectorConfig(min=0, max=1024, step=1)),
|
||||
vol.Required(
|
||||
CONF_USE_GBNF_GRAMMAR,
|
||||
description={"suggested_value": options.get(CONF_USE_GBNF_GRAMMAR)},
|
||||
@@ -952,6 +998,29 @@ def local_llama_config_option_schema(
|
||||
default=DEFAULT_OLLAMA_KEEP_ALIVE_MIN,
|
||||
): NumberSelector(NumberSelectorConfig(min=-1, max=1440, step=1, unit_of_measurement=UnitOfTime.MINUTES, mode=NumberSelectorMode.BOX)),
|
||||
})
|
||||
elif backend_type == BACKEND_TYPE_ANTHROPIC:
|
||||
result.update({
|
||||
vol.Required(
|
||||
CONF_MAX_TOKENS,
|
||||
description={"suggested_value": options.get(CONF_MAX_TOKENS)},
|
||||
default=DEFAULT_MAX_TOKENS,
|
||||
): NumberSelector(NumberSelectorConfig(min=1, max=8192, step=1)),
|
||||
vol.Required(
|
||||
CONF_TOP_K,
|
||||
description={"suggested_value": options.get(CONF_TOP_K)},
|
||||
default=DEFAULT_TOP_K,
|
||||
): NumberSelector(NumberSelectorConfig(min=1, max=256, step=1)),
|
||||
vol.Required(
|
||||
CONF_TOP_P,
|
||||
description={"suggested_value": options.get(CONF_TOP_P)},
|
||||
default=DEFAULT_TOP_P,
|
||||
): NumberSelector(NumberSelectorConfig(min=0, max=1, step=0.05)),
|
||||
vol.Required(
|
||||
CONF_REQUEST_TIMEOUT,
|
||||
description={"suggested_value": options.get(CONF_REQUEST_TIMEOUT)},
|
||||
default=DEFAULT_REQUEST_TIMEOUT,
|
||||
): NumberSelector(NumberSelectorConfig(min=5, max=900, step=1, unit_of_measurement=UnitOfTime.SECONDS, mode=NumberSelectorMode.BOX)),
|
||||
})
|
||||
|
||||
# sort the options
|
||||
global_order = [
|
||||
@@ -975,6 +1044,7 @@ def local_llama_config_option_schema(
|
||||
CONF_TOOL_CALL_SUFFIX,
|
||||
CONF_MAX_TOOL_CALL_ITERATIONS,
|
||||
CONF_ENABLE_LEGACY_TOOL_CALLING,
|
||||
CONF_TOOL_RESPONSE_AS_STRING,
|
||||
CONF_USE_GBNF_GRAMMAR,
|
||||
CONF_GBNF_GRAMMAR_FILE,
|
||||
# integration specific options
|
||||
@@ -989,6 +1059,7 @@ def local_llama_config_option_schema(
|
||||
CONF_IN_CONTEXT_EXAMPLES_FILE,
|
||||
CONF_NUM_IN_CONTEXT_EXAMPLES,
|
||||
# backend specific options
|
||||
CONF_LLAMACPP_CACHE_SIZE_MB,
|
||||
CONF_LLAMACPP_BATCH_SIZE,
|
||||
CONF_LLAMACPP_THREAD_COUNT,
|
||||
CONF_LLAMACPP_BATCH_THREAD_COUNT,
|
||||
|
||||
@@ -63,7 +63,6 @@ USER_INSTRUCTION = {
|
||||
"pl": "Instrukcja użytkownika"
|
||||
}
|
||||
DEFAULT_PROMPT_BASE = """<persona>
|
||||
<current_date>
|
||||
<devices>:
|
||||
{% for device in devices | selectattr('area_id', 'none'): %}
|
||||
{{ device.entity_id }} '{{ device.name }}' = {{ device.state }}{{ ([""] + device.attributes) | join(";") }}
|
||||
@@ -73,23 +72,19 @@ DEFAULT_PROMPT_BASE = """<persona>
|
||||
{% for device in area.list %}
|
||||
{{ device.entity_id }} '{{ device.name }}' = {{ device.state }};{{ device.attributes | join(";") }}
|
||||
{% endfor %}
|
||||
{% endfor %}"""
|
||||
{% endfor %}
|
||||
<current_date>"""
|
||||
DEFAULT_PROMPT_BASE_LEGACY = """<persona>
|
||||
<current_date>
|
||||
<devices>:
|
||||
{{ formatted_devices }}"""
|
||||
{{ formatted_devices }}
|
||||
<current_date>"""
|
||||
ICL_EXTRAS = """
|
||||
{% for item in response_examples %}
|
||||
{{ item.request }}
|
||||
{{ item.response }}
|
||||
{{ tool_call_prefix }}{{ item.tool | to_json }}{{ tool_call_suffix }}
|
||||
{% endfor %}"""
|
||||
ICL_NO_SYSTEM_PROMPT_EXTRAS = """
|
||||
{% for item in response_examples %}
|
||||
{{ item.request }}
|
||||
{{ item.response }}
|
||||
{{ tool_call_prefix }}{{ item.tool | to_json }}{{ tool_call_suffix }}
|
||||
{% endfor %}
|
||||
NO_SYSTEM_PROMPT_EXTRAS = """
|
||||
<user_instruction>:"""
|
||||
DEFAULT_PROMPT = DEFAULT_PROMPT_BASE + ICL_EXTRAS
|
||||
CONF_CHAT_MODEL = "huggingface_model"
|
||||
@@ -120,7 +115,9 @@ BACKEND_TYPE_GENERIC_OPENAI = "generic_openai"
|
||||
BACKEND_TYPE_GENERIC_OPENAI_RESPONSES = "generic_openai_responses"
|
||||
BACKEND_TYPE_LLAMA_CPP_SERVER = "llama_cpp_server"
|
||||
BACKEND_TYPE_OLLAMA = "ollama"
|
||||
BACKEND_TYPE_ANTHROPIC = "anthropic"
|
||||
DEFAULT_BACKEND_TYPE = BACKEND_TYPE_LLAMA_CPP
|
||||
CONF_BASE_URL = "base_url"
|
||||
CONF_INSTALLED_LLAMACPP_VERSION = "installed_llama_cpp_version"
|
||||
CONF_SELECTED_LANGUAGE = "selected_language"
|
||||
CONF_SELECTED_LANGUAGE_OPTIONS = [ "en", "de", "fr", "es", "pl"]
|
||||
@@ -149,6 +146,8 @@ CONF_TOOL_CALL_SUFFIX = "tool_call_suffix"
|
||||
DEFAULT_TOOL_CALL_SUFFIX = "</tool_call>"
|
||||
CONF_ENABLE_LEGACY_TOOL_CALLING = "enable_legacy_tool_calling"
|
||||
DEFAULT_ENABLE_LEGACY_TOOL_CALLING = False
|
||||
CONF_TOOL_RESPONSE_AS_STRING = "tool_response_as_string"
|
||||
DEFAULT_TOOL_RESPONSE_AS_STRING = True
|
||||
CONF_LLAMACPP_ENABLE_FLASH_ATTENTION = "enable_flash_attention"
|
||||
DEFAULT_LLAMACPP_ENABLE_FLASH_ATTENTION = False
|
||||
CONF_USE_GBNF_GRAMMAR = "gbnf_grammar"
|
||||
@@ -162,7 +161,7 @@ DEFAULT_IN_CONTEXT_EXAMPLES_FILE = "in_context_examples.csv"
|
||||
CONF_NUM_IN_CONTEXT_EXAMPLES = "num_in_context_examples"
|
||||
DEFAULT_NUM_IN_CONTEXT_EXAMPLES = 4
|
||||
CONF_TEXT_GEN_WEBUI_PRESET = "text_generation_webui_preset"
|
||||
CONF_OPENAI_API_KEY = "openai_api_key"
|
||||
CONF_API_KEY = "openai_api_key"
|
||||
CONF_TEXT_GEN_WEBUI_ADMIN_KEY = "text_generation_webui_admin_key"
|
||||
CONF_REFRESH_SYSTEM_PROMPT = "refresh_prompt_per_turn"
|
||||
DEFAULT_REFRESH_SYSTEM_PROMPT = True
|
||||
@@ -187,8 +186,8 @@ CONF_OLLAMA_KEEP_ALIVE_MIN = "ollama_keep_alive"
|
||||
DEFAULT_OLLAMA_KEEP_ALIVE_MIN = 30
|
||||
CONF_OLLAMA_JSON_MODE = "ollama_json_mode"
|
||||
DEFAULT_OLLAMA_JSON_MODE = False
|
||||
CONF_GENERIC_OPENAI_PATH = "openai_path"
|
||||
DEFAULT_GENERIC_OPENAI_PATH = "v1"
|
||||
CONF_API_PATH = "openai_path"
|
||||
DEFAULT_API_PATH = "v1"
|
||||
CONF_GENERIC_OPENAI_VALIDATE_MODEL = "openai_validate_model"
|
||||
DEFAULT_GENERIC_OPENAI_VALIDATE_MODEL = True
|
||||
CONF_CONTEXT_LENGTH = "context_length"
|
||||
@@ -201,6 +200,8 @@ DEFAULT_LLAMACPP_THREAD_COUNT = os.cpu_count()
|
||||
CONF_LLAMACPP_BATCH_THREAD_COUNT = "n_batch_threads"
|
||||
DEFAULT_LLAMACPP_BATCH_THREAD_COUNT = os.cpu_count()
|
||||
CONF_LLAMACPP_REINSTALL = "reinstall_llama_cpp"
|
||||
CONF_LLAMACPP_CACHE_SIZE_MB = "llama_cpp_cache_size_mb"
|
||||
DEFAULT_LLAMACPP_CACHE_SIZE_MB = 128
|
||||
|
||||
DEFAULT_OPTIONS = types.MappingProxyType(
|
||||
{
|
||||
@@ -235,6 +236,16 @@ DEFAULT_OPTIONS = types.MappingProxyType(
|
||||
|
||||
def option_overrides(backend_type: str) -> dict[str, Any]:
|
||||
return {
|
||||
"home-functiongemma": {
|
||||
CONF_PROMPT: DEFAULT_PROMPT_BASE + NO_SYSTEM_PROMPT_EXTRAS,
|
||||
CONF_USE_IN_CONTEXT_LEARNING_EXAMPLES: False,
|
||||
CONF_TOOL_CALL_PREFIX: "<start_function_call>",
|
||||
CONF_TOOL_CALL_SUFFIX: "<end_function_call>",
|
||||
CONF_TOOL_RESPONSE_AS_STRING: False, # gemma function calling requires tool responses as a dictionary
|
||||
CONF_TEMPERATURE: 1.0,
|
||||
CONF_TOP_P: 0.95,
|
||||
CONF_TOP_K: 64,
|
||||
},
|
||||
"home-llama-3.2": {
|
||||
CONF_PROMPT: DEFAULT_PROMPT_BASE_LEGACY,
|
||||
CONF_USE_IN_CONTEXT_LEARNING_EXAMPLES: False,
|
||||
@@ -243,7 +254,7 @@ def option_overrides(backend_type: str) -> dict[str, Any]:
|
||||
CONF_CONTEXT_LENGTH: 131072,
|
||||
CONF_MAX_TOOL_CALL_ITERATIONS: 0,
|
||||
# llama cpp server doesn't support custom tool calling formats. so just use legacy tool calling
|
||||
CONF_ENABLE_LEGACY_TOOL_CALLING: backend_type == BACKEND_TYPE_LLAMA_CPP_SERVER
|
||||
CONF_ENABLE_LEGACY_TOOL_CALLING: True
|
||||
},
|
||||
"home-3b-v3": {
|
||||
CONF_PROMPT: DEFAULT_PROMPT_BASE_LEGACY,
|
||||
@@ -252,7 +263,7 @@ def option_overrides(backend_type: str) -> dict[str, Any]:
|
||||
CONF_TOOL_CALL_SUFFIX: "```",
|
||||
CONF_MAX_TOOL_CALL_ITERATIONS: 0,
|
||||
# llama cpp server doesn't support custom tool calling formats. so just use legacy tool calling
|
||||
CONF_ENABLE_LEGACY_TOOL_CALLING: backend_type == BACKEND_TYPE_LLAMA_CPP_SERVER
|
||||
CONF_ENABLE_LEGACY_TOOL_CALLING: True
|
||||
},
|
||||
"home-3b-v2": {
|
||||
CONF_PROMPT: DEFAULT_PROMPT_BASE_LEGACY,
|
||||
@@ -306,14 +317,14 @@ def option_overrides(backend_type: str) -> dict[str, Any]:
|
||||
CONF_TOP_P: 0.95
|
||||
},
|
||||
"mistral": {
|
||||
CONF_PROMPT: DEFAULT_PROMPT_BASE + ICL_NO_SYSTEM_PROMPT_EXTRAS,
|
||||
CONF_PROMPT: DEFAULT_PROMPT_BASE + ICL_EXTRAS + NO_SYSTEM_PROMPT_EXTRAS,
|
||||
CONF_MIN_P: 0.1,
|
||||
CONF_TYPICAL_P: 0.9,
|
||||
# no prompt formats with tool calling support, so just use legacy tool calling
|
||||
CONF_ENABLE_LEGACY_TOOL_CALLING: True,
|
||||
},
|
||||
"mixtral": {
|
||||
CONF_PROMPT: DEFAULT_PROMPT_BASE + ICL_NO_SYSTEM_PROMPT_EXTRAS,
|
||||
CONF_PROMPT: DEFAULT_PROMPT_BASE + ICL_EXTRAS + NO_SYSTEM_PROMPT_EXTRAS,
|
||||
CONF_MIN_P: 0.1,
|
||||
CONF_TYPICAL_P: 0.9,
|
||||
# no prompt formats with tool calling support, so just use legacy tool calling
|
||||
|
||||
@@ -261,12 +261,15 @@ class LocalLLMClient:
|
||||
tool_content += content
|
||||
|
||||
if think_prefix in potential_block and not in_thinking:
|
||||
_LOGGER.debug("Entering thinking block")
|
||||
in_thinking = True
|
||||
last_5_tokens.clear()
|
||||
elif think_suffix in potential_block and in_thinking:
|
||||
_LOGGER.debug("Exiting thinking block")
|
||||
in_thinking = False
|
||||
content = content.replace(think_suffix, "").strip()
|
||||
elif tool_prefix in potential_block and not in_tool_call:
|
||||
_LOGGER.debug("Entering tool call block")
|
||||
in_tool_call = True
|
||||
last_5_tokens.clear()
|
||||
elif tool_suffix in potential_block and in_tool_call:
|
||||
@@ -288,7 +291,12 @@ class LocalLLMClient:
|
||||
if isinstance(raw_tool_call, str):
|
||||
tool_call, to_say = parse_raw_tool_call(raw_tool_call, agent_id)
|
||||
else:
|
||||
tool_call, to_say = parse_raw_tool_call(raw_tool_call["function"], agent_id)
|
||||
# try multiple dict key names
|
||||
function_content = raw_tool_call.get("function") or raw_tool_call.get("function_call") or raw_tool_call.get("tool")
|
||||
if not function_content:
|
||||
_LOGGER.warning("Received tool call dict without 'function', 'function_call' or 'tool' key: %s", raw_tool_call)
|
||||
continue
|
||||
tool_call, to_say = parse_raw_tool_call(function_content, agent_id)
|
||||
|
||||
if tool_call:
|
||||
_LOGGER.debug("Tool call parsed: %s", tool_call)
|
||||
@@ -302,6 +310,20 @@ class LocalLLMClient:
|
||||
if not in_thinking and not in_tool_call and (cur_match_length == 0 or result.tool_calls):
|
||||
yield result
|
||||
|
||||
if in_tool_call and tool_content:
|
||||
# flush any unclosed tool calls because using the tool_suffix as a stop token can
|
||||
# cause the tool_suffix to be omitted when the model streams output
|
||||
tool_block = tool_content.strip().removeprefix(tool_prefix)
|
||||
_LOGGER.debug("Raw tool block extracted at end: %s", tool_block)
|
||||
tool_call, to_say = parse_raw_tool_call(tool_block, agent_id)
|
||||
if tool_call:
|
||||
_LOGGER.debug("Tool call parsed at end: %s", tool_call)
|
||||
yield TextGenerationResult(
|
||||
response=to_say,
|
||||
response_streamed=True,
|
||||
tool_calls=[tool_call]
|
||||
)
|
||||
|
||||
async def _async_parse_completion(
|
||||
self,
|
||||
llm_api: llm.APIInstance | None,
|
||||
@@ -336,8 +358,12 @@ class LocalLLMClient:
|
||||
if isinstance(raw_tool_call, str):
|
||||
tool_call, to_say = parse_raw_tool_call(raw_tool_call, agent_id)
|
||||
else:
|
||||
tool_call, to_say = parse_raw_tool_call(raw_tool_call["function"], agent_id)
|
||||
|
||||
# try multiple dict key names
|
||||
function_content = raw_tool_call.get("function") or raw_tool_call.get("function_call") or raw_tool_call.get("tool")
|
||||
if not function_content:
|
||||
_LOGGER.warning("Received tool call dict without 'function', 'function_call' or 'tool' key: %s", raw_tool_call)
|
||||
continue
|
||||
tool_call, to_say = parse_raw_tool_call(function_content, agent_id)
|
||||
if tool_call:
|
||||
_LOGGER.debug("Tool call parsed: %s", tool_call)
|
||||
parsed_tool_calls.append(tool_call)
|
||||
@@ -471,7 +497,6 @@ class LocalLLMClient:
|
||||
entities_to_expose = self._async_get_exposed_entities()
|
||||
|
||||
extra_attributes_to_expose = entity_options.get(CONF_EXTRA_ATTRIBUTES_TO_EXPOSE, DEFAULT_EXTRA_ATTRIBUTES_TO_EXPOSE)
|
||||
enable_legacy_tool_calling = entity_options.get(CONF_ENABLE_LEGACY_TOOL_CALLING, DEFAULT_ENABLE_LEGACY_TOOL_CALLING)
|
||||
tool_call_prefix = entity_options.get(CONF_TOOL_CALL_PREFIX, DEFAULT_TOOL_CALL_PREFIX)
|
||||
tool_call_suffix = entity_options.get(CONF_TOOL_CALL_SUFFIX, DEFAULT_TOOL_CALL_SUFFIX)
|
||||
|
||||
@@ -545,21 +570,16 @@ class LocalLLMClient:
|
||||
"tool_call_suffix": tool_call_suffix,
|
||||
}
|
||||
|
||||
if enable_legacy_tool_calling:
|
||||
if llm_api:
|
||||
tools = []
|
||||
for tool in llm_api.tools:
|
||||
tools.append(f"{tool.name}({','.join(flatten_vol_schema(tool.parameters))})")
|
||||
render_variables["tools"] = tools
|
||||
render_variables["formatted_tools"] = ", ".join(tools)
|
||||
else:
|
||||
message = "No tools were provided. If the user requests you interact with a device, tell them you are unable to do so."
|
||||
render_variables["tools"] = [message]
|
||||
render_variables["formatted_tools"] = message
|
||||
if llm_api:
|
||||
tools = []
|
||||
for tool in llm_api.tools:
|
||||
tools.append(f"{tool.name}({','.join(flatten_vol_schema(tool.parameters))})")
|
||||
render_variables["tools"] = tools
|
||||
render_variables["formatted_tools"] = ", ".join(tools)
|
||||
else:
|
||||
# Tools are passed via the API not the prompt
|
||||
render_variables["tools"] = []
|
||||
render_variables["formatted_tools"] = ""
|
||||
message = "No tools were provided. If the user requests you interact with a device, tell them you are unable to do so."
|
||||
render_variables["tools"] = [message]
|
||||
render_variables["formatted_tools"] = message
|
||||
|
||||
# only pass examples if there are loaded examples + an API was exposed
|
||||
if self.in_context_examples and llm_api:
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"domain": "llama_conversation",
|
||||
"name": "Local LLMs",
|
||||
"version": "0.4.5",
|
||||
"version": "0.4.6",
|
||||
"codeowners": ["@acon96"],
|
||||
"config_flow": true,
|
||||
"dependencies": ["conversation", "ai_task"],
|
||||
@@ -12,6 +12,7 @@
|
||||
"requirements": [
|
||||
"huggingface-hub>=0.23.0",
|
||||
"webcolors>=24.8.0",
|
||||
"ollama>=0.5.1"
|
||||
"ollama>=0.5.1",
|
||||
"anthropic>=0.75.0"
|
||||
]
|
||||
}
|
||||
|
||||
@@ -22,7 +22,8 @@
|
||||
"openai_path": "API Path",
|
||||
"text_generation_webui_admin_key": "Admin Key",
|
||||
"text_generation_webui_preset": "Generation Preset/Character Name",
|
||||
"text_generation_webui_chat_mode": "Chat Mode"
|
||||
"text_generation_webui_chat_mode": "Chat Mode",
|
||||
"anthropic_base_url": "Anthropic Compatible API Base URL"
|
||||
},
|
||||
"description": "Please select the backend and/or provide the connection details to connect to the API that is hosting the model.",
|
||||
"title": "Configure Backend"
|
||||
@@ -101,11 +102,13 @@
|
||||
"batch_size": "(llama.cpp) Batch Size",
|
||||
"n_threads": "(llama.cpp) Thread Count",
|
||||
"n_batch_threads": "(llama.cpp) Batch Thread Count",
|
||||
"llama_cpp_cache_size_mb": "(llama.cpp) Disk KV Cache Size (MB)",
|
||||
"thinking_prefix": "Reasoning Content Prefix",
|
||||
"thinking_suffix": "Reasoning Content Suffix",
|
||||
"tool_call_prefix": "Tool Call Prefix",
|
||||
"tool_call_suffix": "Tool Call Suffix",
|
||||
"enable_legacy_tool_calling": "Enable Legacy Tool Calling",
|
||||
"tool_response_as_string": "Tool Response as String",
|
||||
"max_tool_call_iterations": "Maximum Tool Call Attempts"
|
||||
},
|
||||
"data_description": {
|
||||
@@ -116,6 +119,7 @@
|
||||
"gbnf_grammar": "Forces the model to output properly formatted responses. Ensure the file specified below exists in the integration directory.",
|
||||
"prompt_caching": "Prompt caching attempts to pre-process the prompt (house state) and cache the processing that needs to be done to understand the prompt. Enabling this will cause the model to re-process the prompt any time an entity state changes in the house, restricted by the interval below.",
|
||||
"enable_legacy_tool_calling": "Prefer to process tool calls locally rather than relying on the backend to handle the tool calling format. Can be more reliable, however it requires properly setting the tool call prefix and suffix.",
|
||||
"tool_response_as_string": "Some prompt templates expect the tool response to be provided as a JSON serialized string, rather than the raw object.",
|
||||
"max_tool_call_iterations": "Set to 0 to generate the response and tool call in one attempt, without looping (use this for Home models v1-v3)."
|
||||
},
|
||||
"description": "Please configure the model according to how it should be prompted. There are many different options and selecting the correct ones for your model is essential to getting optimal performance. See [here](https://github.com/acon96/home-llm/blob/develop/docs/Backend%20Configuration.md) for more information about the options on this page.\n\n**Some defaults may have been chosen for you based on the name of the selected model name or filename.** If you renamed a file or are using a fine-tuning of a supported model, then the defaults may not have been detected.",
|
||||
@@ -155,11 +159,13 @@
|
||||
"batch_size": "(llama.cpp) Batch Size",
|
||||
"n_threads": "(llama.cpp) Thread Count",
|
||||
"n_batch_threads": "(llama.cpp) Batch Thread Count",
|
||||
"llama_cpp_cache_size_mb": "(llama.cpp) Disk KV Cache Size (MB)",
|
||||
"thinking_prefix": "Reasoning Content Prefix",
|
||||
"thinking_suffix": "Reasoning Content Suffix",
|
||||
"tool_call_prefix": "Tool Call Prefix",
|
||||
"tool_call_suffix": "Tool Call Suffix",
|
||||
"enable_legacy_tool_calling": "Enable Legacy Tool Calling",
|
||||
"tool_response_as_string": "Tool Response as String",
|
||||
"max_tool_call_iterations": "Maximum Tool Call Attempts"
|
||||
},
|
||||
"data_description": {
|
||||
@@ -170,6 +176,7 @@
|
||||
"gbnf_grammar": "Forces the model to output properly formatted responses. Ensure the file specified below exists in the integration directory.",
|
||||
"prompt_caching": "Prompt caching attempts to pre-process the prompt (house state) and cache the processing that needs to be done to understand the prompt. Enabling this will cause the model to re-process the prompt any time an entity state changes in the house, restricted by the interval below.",
|
||||
"enable_legacy_tool_calling": "Prefer to process tool calls locally rather than relying on the backend to handle the tool calling format. Can be more reliable, however it requires properly setting the tool call prefix and suffix.",
|
||||
"tool_response_as_string": "Some prompt templates expect the tool response to be provided as a JSON serialized string, rather than the raw object.",
|
||||
"max_tool_call_iterations": "Set to 0 to generate the response and tool call in one attempt, without looping (use this for Home models v1-v3)."
|
||||
},
|
||||
"description": "Please configure the model according to how it should be prompted. There are many different options and selecting the correct ones for your model is essential to getting optimal performance. See [here](https://github.com/acon96/home-llm/blob/develop/docs/Backend%20Configuration.md) for more information about the options on this page.\n\n**Some defaults may have been chosen for you based on the name of the selected model name or filename.** If you renamed a file or are using a fine-tuning of a supported model, then the defaults may not have been detected.",
|
||||
@@ -241,11 +248,13 @@
|
||||
"batch_size": "(llama.cpp) Batch Size",
|
||||
"n_threads": "(llama.cpp) Thread Count",
|
||||
"n_batch_threads": "(llama.cpp) Batch Thread Count",
|
||||
"llama_cpp_cache_size_mb": "(llama.cpp) Disk KV Cache Size (MB)",
|
||||
"thinking_prefix": "Reasoning Content Prefix",
|
||||
"thinking_suffix": "Reasoning Content Suffix",
|
||||
"tool_call_prefix": "Tool Call Prefix",
|
||||
"tool_call_suffix": "Tool Call Suffix",
|
||||
"enable_legacy_tool_calling": "Enable Legacy Tool Calling",
|
||||
"tool_response_as_string": "Tool Response as String",
|
||||
"max_tool_call_iterations": "Maximum Tool Call Attempts",
|
||||
"ai_task_extraction_method": "Structured Data Extraction Method",
|
||||
"ai_task_retries": "Retry attempts for structured data extraction"
|
||||
@@ -257,6 +266,7 @@
|
||||
"gbnf_grammar": "Forces the model to output properly formatted responses. Ensure the file specified below exists in the integration directory.",
|
||||
"prompt_caching": "Prompt caching attempts to pre-process the prompt (house state) and cache the processing that needs to be done to understand the prompt. Enabling this will cause the model to re-process the prompt any time an entity state changes in the house, restricted by the interval below.",
|
||||
"enable_legacy_tool_calling": "Prefer to process tool calls locally rather than relying on the backend to handle the tool calling format. Can be more reliable, however it requires properly setting the tool call prefix and suffix.",
|
||||
"tool_response_as_string": "Some prompt templates expect the tool response to be provided as a JSON serialized string, rather than the raw object.",
|
||||
"max_tool_call_iterations": "Set to 0 to generate the response and tool call in one attempt, without looping (use this for Home models v1-v3).",
|
||||
"ai_task_extraction_method": "Select the method used to extract structured data from the model's response. 'Structured Output' tells the backend to force the model to produce output following the provided JSON Schema; 'Tool Calling' provides a tool to the model that should be called with the appropriate arguments that match the desired output structure."
|
||||
},
|
||||
@@ -297,11 +307,13 @@
|
||||
"batch_size": "(llama.cpp) Batch Size",
|
||||
"n_threads": "(llama.cpp) Thread Count",
|
||||
"n_batch_threads": "(llama.cpp) Batch Thread Count",
|
||||
"llama_cpp_cache_size_mb": "(llama.cpp) Disk KV Cache Size (MB)",
|
||||
"thinking_prefix": "Reasoning Content Prefix",
|
||||
"thinking_suffix": "Reasoning Content Suffix",
|
||||
"tool_call_prefix": "Tool Call Prefix",
|
||||
"tool_call_suffix": "Tool Call Suffix",
|
||||
"enable_legacy_tool_calling": "Enable Legacy Tool Calling",
|
||||
"tool_response_as_string": "Tool Response as String",
|
||||
"max_tool_call_iterations": "Maximum Tool Call Attempts"
|
||||
},
|
||||
"data_description": {
|
||||
@@ -312,6 +324,7 @@
|
||||
"gbnf_grammar": "Forces the model to output properly formatted responses. Ensure the file specified below exists in the integration directory.",
|
||||
"prompt_caching": "Prompt caching attempts to pre-process the prompt (house state) and cache the processing that needs to be done to understand the prompt. Enabling this will cause the model to re-process the prompt any time an entity state changes in the house, restricted by the interval below.",
|
||||
"enable_legacy_tool_calling": "Prefer to process tool calls locally rather than relying on the backend to handle the tool calling format. Can be more reliable, however it requires properly setting the tool call prefix and suffix.",
|
||||
"tool_response_as_string": "Some prompt templates expect the tool response to be provided as a JSON serialized string, rather than the raw object.",
|
||||
"max_tool_call_iterations": "Set to 0 to generate the response and tool call in one attempt, without looping (use this for Home models v1-v3)."
|
||||
},
|
||||
"description": "Please configure the model according to how it should be prompted. There are many different options and selecting the correct ones for your model is essential to getting optimal performance. See [here](https://github.com/acon96/home-llm/blob/develop/docs/Backend%20Configuration.md) for more information about the options on this page.\n\n**Some defaults may have been chosen for you based on the name of the selected model name or filename.** If you renamed a file or are using a fine-tuning of a supported model, then the defaults may not have been detected.",
|
||||
@@ -360,12 +373,12 @@
|
||||
"model_backend": {
|
||||
"options": {
|
||||
"llama_cpp_python": "Llama.cpp",
|
||||
"generic_openai": "Generic OpenAI Compatible API",
|
||||
"generic_openai_responses": "Generic OpenAPI Compatible Responses API",
|
||||
"generic_openai": "OpenAI Compatible 'Conversations' API",
|
||||
"generic_openai_responses": "OpenAPI Compatible 'Responses' API",
|
||||
"llama_cpp_server": "Llama.cpp Server",
|
||||
"ollama": "Ollama API",
|
||||
"text-generation-webui_api": "text-generation-webui API"
|
||||
|
||||
"text-generation-webui_api": "text-generation-webui API",
|
||||
"anthropic": "Anthropic Compatible 'Messages' API"
|
||||
}
|
||||
},
|
||||
"text_generation_webui_chat_mode": {
|
||||
|
||||
@@ -278,7 +278,8 @@ def format_url(*, hostname: str, port: str, ssl: bool, path: str):
|
||||
def get_oai_formatted_tools(llm_api: llm.APIInstance, domains: list[str]) -> List[ChatCompletionTool]:
|
||||
result: List[ChatCompletionTool] = []
|
||||
|
||||
for tool in llm_api.tools:
|
||||
# sort tools by name to improve cache hits
|
||||
for tool in sorted(llm_api.tools, key=lambda t: t.name):
|
||||
# when combining with home assistant llm APIs, it adds a prefix to differentiate tools; compare against the suffix here
|
||||
if tool.name.endswith(SERVICE_TOOL_NAME):
|
||||
result.extend([{
|
||||
@@ -302,7 +303,13 @@ def get_oai_formatted_tools(llm_api: llm.APIInstance, domains: list[str]) -> Lis
|
||||
|
||||
return result
|
||||
|
||||
def get_oai_formatted_messages(conversation: Sequence[conversation.Content], user_content_as_list: bool = False, tool_args_to_str: bool = True) -> List[ChatCompletionRequestMessage]:
|
||||
def get_oai_formatted_messages(
|
||||
conversation: Sequence[conversation.Content],
|
||||
*,
|
||||
user_content_as_list: bool = False,
|
||||
tool_args_to_str: bool = True,
|
||||
tool_result_to_str: bool = True,
|
||||
) -> List[ChatCompletionRequestMessage]:
|
||||
messages: List[ChatCompletionRequestMessage] = []
|
||||
for message in conversation:
|
||||
if message.role == "system":
|
||||
@@ -354,9 +361,16 @@ def get_oai_formatted_messages(conversation: Sequence[conversation.Content], use
|
||||
]
|
||||
})
|
||||
elif message.role == "tool_result":
|
||||
if tool_result_to_str:
|
||||
content = json.dumps(message.tool_result)
|
||||
else:
|
||||
content = {
|
||||
"name": message.tool_name,
|
||||
"response": { "result": message.tool_result },
|
||||
}
|
||||
messages.append({
|
||||
"role": "tool",
|
||||
"content": json.dumps(message.tool_result),
|
||||
"content": content,
|
||||
"tool_call_id": message.tool_call_id
|
||||
})
|
||||
|
||||
@@ -404,7 +418,26 @@ def parse_raw_tool_call(raw_block: str | dict, agent_id: str) -> tuple[llm.ToolI
|
||||
if isinstance(raw_block, dict):
|
||||
parsed_tool_call = raw_block
|
||||
else:
|
||||
parsed_tool_call: dict = json.loads(raw_block)
|
||||
try:
|
||||
parsed_tool_call: dict = json.loads(raw_block)
|
||||
except json.JSONDecodeError:
|
||||
# handle the "gemma" tool calling format
|
||||
# call:HassTurnOn{name:<escape>light.living_room_rgbww<escape>}
|
||||
gemma_match = re.finditer(r"call:(?P<name>\w+){(?P<args>.+)}", raw_block)
|
||||
for match in gemma_match:
|
||||
tool_name = match.group("name")
|
||||
raw_args = match.group("args")
|
||||
args_dict = {}
|
||||
for arg_match in re.finditer(r"(?P<key>\w+):<escape>(?P<value>.+?)<escape>", raw_args):
|
||||
args_dict[arg_match.group("key")] = arg_match.group("value")
|
||||
|
||||
parsed_tool_call = {
|
||||
"name": tool_name,
|
||||
"arguments": args_dict
|
||||
}
|
||||
break # TODO: how do we properly handle multiple tool calls in one response?
|
||||
else:
|
||||
raise MalformedToolCallException(agent_id, "", "unknown", str(raw_block), "Tool call was not properly formatted JSON")
|
||||
|
||||
# try to validate either format
|
||||
is_services_tool_call = False
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
huggingface-hub>=0.23.0
|
||||
webcolors>=24.8.0
|
||||
ollama>=0.5.1
|
||||
anthropic>=0.75.0
|
||||
|
||||
@@ -9,18 +9,24 @@ tags:
|
||||
- assistant
|
||||
language:
|
||||
- en
|
||||
pretty_name: Home Assistant Requests
|
||||
pretty_name: Home Assistant Requests V2
|
||||
size_categories:
|
||||
- 10K<n<100k
|
||||
---
|
||||
|
||||
# Home Assistant Requests Dataset
|
||||
# Home Assistant Requests V2 Dataset
|
||||
|
||||
This dataset contains a list of requests and responses for a user interacting with a personal assistant that controls an instance of [Home Assistant](https://www.home-assistant.io/).
|
||||
|
||||
The dataset is generated from the different CSV "piles". The "piles" contain different chunks of requests that are assembled into a final context that is presented to the LLM. For example, `piles/<language>/pile_of_device_names.csv` contains only names of various devices to be used as part of context as well as inserted into `piles/<language>/pile_of_templated_actions.csv` and `piles/<language>/pile_of_status_requests.csv`. The logic for assembling the final dataset from the piles is contained in [generate_home_assistant_data.py](./generate_home_assistant_data.py).
|
||||
The updated V2 of the dataset is now multilingual, containing data in English, German, French, Spanish, and Polish. The dataset also contains multiple "personalities" for the assistant to respond in, such as a formal assistant, a sarcastic assistant, and a friendly assistant. Lastly, the dataset has been updated to fully support modern tool-calling formats.
|
||||
|
||||
## Prepare environment
|
||||
## Assembling the dataset
|
||||
|
||||
> NOTE: If you are viewing this dataset on HuggingFace, you can download the "small" dataset variant directly from the "Files and versions" tab.
|
||||
|
||||
The dataset is generated from the different CSV "piles". The "piles" contain different chunks of requests that are assembled into a final context that is presented to the LLM. For example, `piles/<language>/pile_of_device_names.csv` contains only names of various devices to be used as part of context as well as inserted into `piles/<language>/pile_of_templated_actions.csv` and `piles/<language>/pile_of_status_requests.csv`. The logic for assembling the final dataset from the piles is contained in [generate_data.py](./generate_data.py).
|
||||
|
||||
### Prepare environment
|
||||
|
||||
Start by installing system dependencies:
|
||||
`sudo apt-get install python3-dev`
|
||||
@@ -32,25 +38,14 @@ source .generate_data/bin/activate
|
||||
pip3 install -r requirements.txt
|
||||
```
|
||||
|
||||
## Generating the dataset from piles
|
||||
### Generating the dataset from piles
|
||||
|
||||
`python3 generate_home_assistant_data.py --train --test --large --sharegpt`
|
||||
`python3 generate_data.py --train --test --small --language english german french spanish polish`
|
||||
|
||||
Supported dataset splits are `--test`, `--train`, & `--sample`
|
||||
Arguments to set the train dataset size are `--small`, `--medium`, `--large`, & `--xl`.
|
||||
Supported formats are `--raw_corpus` (chatml formatted) & `--sharegpt`
|
||||
Languages can be enabled using `--language english german french spanish polish`
|
||||
|
||||
## Merging with other instruct-datasets for training
|
||||
|
||||
`python3 generate_home_assistant_data.py --merge <dataset>`
|
||||
|
||||
Supported datasets right now are:
|
||||
- `alpaca`
|
||||
- `wizardlm70k`
|
||||
|
||||
Please note that the supported datasets all have different licenses. Be aware that the license of the resulting data mixture might be different that the license of this dataset alone.
|
||||
|
||||
## Adding a new personality
|
||||
In order to add a new personality, you need to define a new system prompt and new set of responses for the assistant. The system prompt is the description of the assistant's behavior that occurs at the start of the context. The responses are what is said back to the user when performing a task. The model should still respond with the correct service call no matter what the assistant's response is. The list of system prompts are stored in `pile_of_system_prompts.csv`, and the list of responses are stored in `pile_of_responses.csv`
|
||||
|
||||
@@ -66,9 +61,29 @@ The response pile is a CSV with the following headers: `service,response,languag
|
||||
|
||||
Generating the full dataset using the python script will print out a warning for any responses that are missing for a persona.
|
||||
|
||||
## Synthesizing new pile data
|
||||
You can quickly append fresh examples to the CSV piles without editing them manually by running `synthesize.py`. The script talks to the configured LLM and writes the generated rows directly into the per-language pile files.
|
||||
|
||||
Examples:
|
||||
|
||||
```bash
|
||||
# Append 25 failed tool-call recoveries and 25 refusals in Spanish
|
||||
python3 synthesize.py --language spanish --model gpt-oss-120b --failed-tool-calls 25 --refusals 25 --concurrency 6
|
||||
|
||||
# Generate new actions plus matching refusal samples in German
|
||||
python3 synthesize.py --language german --actions 100 --refusals 40 --model gpt-oss-120b
|
||||
```
|
||||
|
||||
Useful flags:
|
||||
- `--failed-tool-calls`: number of `pile_of_failed_tool_calls.csv` rows to synthesize.
|
||||
- `--refusals`: number of `pile_of_refusals.csv` rows to synthesize.
|
||||
- `--actions`, `--status`, `--devices`: existing knobs for the other piles.
|
||||
|
||||
The script automatically routes generations to the correct language-specific pile under `data/piles/<language>/`.
|
||||
|
||||
## Adding new Home Assistant functionality
|
||||
TODO
|
||||
<!-- In order to add new home assistant device types, you will need to add data to a handful of piles, as well as make small modifications to the `generate_home_assistant_data.py` script.
|
||||
<!-- In order to add new home assistant device types, you will need to add data to a handful of piles, as well as make small modifications to the `generate_data.py` script.
|
||||
1. Add 15-30 new device names with the new type to the `pile_of_device_names.csv`. This should be an entity_id and a 'friendly name'
|
||||
2. Add
|
||||
-->
|
||||
|
||||
308
data/devices.py
Normal file
308
data/devices.py
Normal file
@@ -0,0 +1,308 @@
|
||||
from collections import defaultdict
|
||||
import random
|
||||
from dataclasses import dataclass
|
||||
from typing import Final, Callable, List
|
||||
from difflib import SequenceMatcher
|
||||
|
||||
from tools import *
|
||||
from utils import PileOfDeviceType, closest_color, generate_random_parameter, get_dataset_piles
|
||||
|
||||
# STATES
|
||||
STATE_ON: Final = "on"
|
||||
STATE_OFF: Final = "off"
|
||||
STATE_ACTIVE: Final = "active"
|
||||
STATE_UNKNOWN: Final = "unknown"
|
||||
STATE_OPEN: Final = "open"
|
||||
STATE_OPENING: Final = "opening"
|
||||
STATE_CLOSED: Final = "closed"
|
||||
STATE_CLOSING: Final = "closing"
|
||||
STATE_BUFFERING: Final = "buffering"
|
||||
STATE_PLAYING: Final = "playing"
|
||||
STATE_PAUSED: Final = "paused"
|
||||
STATE_IDLE: Final = "idle"
|
||||
STATE_STANDBY: Final = "standby"
|
||||
STATE_LOCKED: Final = "locked"
|
||||
STATE_UNLOCKED: Final = "unlocked"
|
||||
STATE_LOCKING: Final = "locking"
|
||||
STATE_UNLOCKING: Final = "unlocking"
|
||||
STATE_JAMMED: Final = "jammed"
|
||||
STATE_UNAVAILABLE: Final = "unavailable"
|
||||
STATE_OK: Final = "ok"
|
||||
STATE_PROBLEM: Final = "problem"
|
||||
STATE_CLEANING: Final = "cleaning"
|
||||
STATE_DOCKED: Final = "docked"
|
||||
STATE_RETURNING: Final = "returning"
|
||||
|
||||
def format_device_line(*, device_name: str, friendly_name: str, state: str):
|
||||
return (f"{device_name} '{friendly_name}' = {state}")
|
||||
|
||||
@dataclass
|
||||
class DeviceType:
|
||||
name: str
|
||||
possible_states: list[tuple[str, float]]
|
||||
|
||||
def get_random_state(self, language: str, extra_exposed_attributes: list[str] | None = None):
|
||||
states = [ x[0] for x in self.possible_states ]
|
||||
weights = [ x[1] for x in self.possible_states ]
|
||||
return random.choices(states, weights=weights, k=1)[0]
|
||||
|
||||
def get_all_tools(self, extra_exposed_attributes: List[str]):
|
||||
"""Return list of tool names available for this device type."""
|
||||
tools = [TOOL_TURN_ON, TOOL_TURN_OFF, TOOL_TOGGLE]
|
||||
return tools
|
||||
|
||||
def get_random_parameter(self, param_name: str, language: str):
|
||||
"""Generate a random parameter value."""
|
||||
return generate_random_parameter(param_name, get_dataset_piles(language))
|
||||
|
||||
|
||||
class LightDeviceType(DeviceType):
|
||||
def __init__(self):
|
||||
super().__init__("light",
|
||||
possible_states=[
|
||||
(STATE_ON, 0.5),
|
||||
(STATE_OFF, 0.5)
|
||||
]
|
||||
)
|
||||
|
||||
def get_random_state(self, language: str, extra_exposed_attributes: list[str] | None = None):
|
||||
extra_exposed_attributes = extra_exposed_attributes or []
|
||||
state = super().get_random_state(language, extra_exposed_attributes=extra_exposed_attributes)
|
||||
|
||||
if random.random() < 0.5 and "rgb_color" in extra_exposed_attributes:
|
||||
random_rgb = generate_random_parameter("rgb_color", get_dataset_piles(language))
|
||||
state = state + ";" + closest_color(random_rgb) + " " + str(random_rgb)
|
||||
|
||||
if random.random() < 0.7 and "brightness" in extra_exposed_attributes:
|
||||
state = state + ";" + str(generate_random_parameter("brightness", get_dataset_piles(language))) + "%"
|
||||
return state
|
||||
|
||||
def get_all_tools(self, extra_exposed_attributes: List[str]):
|
||||
"""Return list of tool names available for lights."""
|
||||
tools = [TOOL_TURN_ON, TOOL_TURN_OFF, TOOL_TOGGLE]
|
||||
if "brightness" in extra_exposed_attributes or "rgb_color" in extra_exposed_attributes:
|
||||
tools.append(TOOL_LIGHT_SET)
|
||||
return tools
|
||||
|
||||
class SwitchDeviceType(DeviceType):
|
||||
def __init__(self):
|
||||
super().__init__("switch", [
|
||||
(STATE_ON, 0.5),
|
||||
(STATE_OFF, 0.5)
|
||||
])
|
||||
|
||||
class FanDeviceType(DeviceType):
|
||||
def __init__(self):
|
||||
super().__init__("fan", [
|
||||
(STATE_ON, 0.5),
|
||||
(STATE_OFF, 0.5)
|
||||
])
|
||||
|
||||
class GarageDoorDeviceType(DeviceType):
|
||||
def __init__(self):
|
||||
super().__init__("garage_door", [
|
||||
(STATE_OPEN, 0.49),
|
||||
(STATE_CLOSED, 0.49),
|
||||
(STATE_OPENING, 0.01),
|
||||
(STATE_CLOSING, 0.01)
|
||||
])
|
||||
|
||||
def get_all_tools(self, extra_exposed_attributes: List[str]):
|
||||
tools = [TOOL_TURN_ON, TOOL_TURN_OFF, TOOL_TOGGLE]
|
||||
if "position" in extra_exposed_attributes:
|
||||
tools.append(TOOL_SET_POSITION)
|
||||
return tools
|
||||
|
||||
class BlindsDeviceType(DeviceType):
|
||||
def __init__(self):
|
||||
super().__init__("blinds", [
|
||||
(STATE_OPEN, 0.49),
|
||||
(STATE_CLOSED, 0.49),
|
||||
(STATE_OPENING, 0.01),
|
||||
(STATE_CLOSING, 0.01)
|
||||
])
|
||||
|
||||
def get_all_tools(self, extra_exposed_attributes: List[str]):
|
||||
tools = [TOOL_TURN_ON, TOOL_TURN_OFF, TOOL_TOGGLE]
|
||||
if "position" in extra_exposed_attributes:
|
||||
tools.append(TOOL_SET_POSITION)
|
||||
return tools
|
||||
|
||||
class LockDeviceType(DeviceType):
|
||||
def __init__(self):
|
||||
super().__init__("lock", [
|
||||
(STATE_LOCKED, 0.5),
|
||||
(STATE_UNLOCKED, 0.5),
|
||||
])
|
||||
|
||||
class VacuumDeviceType(DeviceType):
|
||||
def __init__(self):
|
||||
super().__init__("vacuum", [
|
||||
(STATE_CLEANING, 0.2),
|
||||
(STATE_DOCKED, 0.6),
|
||||
(STATE_RETURNING, 0.1),
|
||||
(STATE_IDLE, 0.05),
|
||||
(STATE_PAUSED, 0.05),
|
||||
])
|
||||
|
||||
def get_all_tools(self, extra_exposed_attributes: List[str]):
|
||||
return [TOOL_VACUUM_START, TOOL_VACUUM_RETURN_TO_BASE]
|
||||
|
||||
class TimerDeviceType(DeviceType):
|
||||
def __init__(self):
|
||||
super().__init__("timer", [
|
||||
(STATE_IDLE, 0.2),
|
||||
(STATE_ACTIVE, 0.6),
|
||||
(STATE_PAUSED, 0.1),
|
||||
])
|
||||
|
||||
def get_all_tools(self, extra_exposed_attributes: List[str]):
|
||||
tools = [TOOL_START_TIMER, TOOL_CANCEL_TIMER, TOOL_PAUSE_TIMER, TOOL_UNPAUSE_TIMER]
|
||||
if "duration" in extra_exposed_attributes:
|
||||
tools.extend([TOOL_INCREASE_TIMER, TOOL_DECREASE_TIMER, TOOL_TIMER_STATUS])
|
||||
return tools
|
||||
|
||||
class TodoDeviceType(DeviceType):
|
||||
def __init__(self):
|
||||
super().__init__("todo", [ (f"{i}", (1/32)) for i in range(32) ],)
|
||||
|
||||
def get_all_tools(self, extra_exposed_attributes: List[str]):
|
||||
return [TOOL_LIST_ADD_ITEM]
|
||||
|
||||
class ClimateDeviceType(DeviceType):
|
||||
def __init__(self):
|
||||
super().__init__("climate", [])
|
||||
|
||||
def get_random_state(self, language: str, extra_exposed_attributes: list[str] | None = None):
|
||||
"""state;fan_mode;temperature;humidity"""
|
||||
extra_exposed_attributes = extra_exposed_attributes or []
|
||||
state = generate_random_parameter("hvac_mode", get_dataset_piles(language))
|
||||
|
||||
if "fan_mode" in extra_exposed_attributes:
|
||||
state = state + ";" + generate_random_parameter("fan_mode", get_dataset_piles(language))
|
||||
if "temperature" in extra_exposed_attributes:
|
||||
if random.random() > 0.5:
|
||||
state = state + ";" + str(generate_random_parameter("temp_f", get_dataset_piles(language))) + "F"
|
||||
else:
|
||||
state = state + ";" + str(generate_random_parameter("temp_c", get_dataset_piles(language))) + "C"
|
||||
if "humidity" in extra_exposed_attributes:
|
||||
state = state + ";" + str(generate_random_parameter("humidity", get_dataset_piles(language))) + "%"
|
||||
if random.random() < 0.8 and "preset_mode" in extra_exposed_attributes:
|
||||
# if it is not "on a preset" then don't add the mode
|
||||
state = state + ";" + generate_random_parameter("preset_mode", get_dataset_piles(language))
|
||||
|
||||
return state
|
||||
|
||||
def get_all_tools(self, extra_exposed_attributes: List[str]):
|
||||
"""Return list of tool names available for climate devices."""
|
||||
tools = [TOOL_TURN_ON, TOOL_TURN_OFF]
|
||||
if "temperature" in extra_exposed_attributes or "fan_mode" in extra_exposed_attributes:
|
||||
tools.append(TOOL_CLIMATE_SET_TEMPERATURE)
|
||||
if "humidity" in extra_exposed_attributes:
|
||||
tools.extend([TOOL_SET_HUMIDITY, TOOL_SET_HUMIDIFIER_MODE])
|
||||
return tools
|
||||
|
||||
class MediaPlayerDeviceType(DeviceType):
|
||||
def __init__(self):
|
||||
super().__init__("media_player", [
|
||||
(STATE_ON, 0.15),
|
||||
(STATE_OFF, 0.54),
|
||||
(STATE_IDLE, 0.1),
|
||||
(STATE_PLAYING, 0.1),
|
||||
(STATE_PAUSED, 0.05),
|
||||
(STATE_STANDBY, 0.05),
|
||||
(STATE_BUFFERING, 0.01),
|
||||
])
|
||||
|
||||
def get_random_state(self, language: str, extra_exposed_attributes: list[str] | None = None):
|
||||
extra_exposed_attributes = extra_exposed_attributes or []
|
||||
state = super().get_random_state(language, extra_exposed_attributes=extra_exposed_attributes)
|
||||
|
||||
if "media_title" in extra_exposed_attributes and state in [STATE_PLAYING, STATE_PAUSED, STATE_BUFFERING, STATE_ON]:
|
||||
state = state + ";" + generate_random_parameter("media", get_dataset_piles(language))
|
||||
if "volume_level" in extra_exposed_attributes and state != STATE_OFF:
|
||||
state = state + ";vol=" + str(generate_random_parameter("volume", get_dataset_piles(language))) + "%"
|
||||
return state
|
||||
|
||||
def get_all_tools(self, extra_exposed_attributes: List[str]):
|
||||
"""Return list of tool names available for media players."""
|
||||
tools = [TOOL_TURN_ON, TOOL_TURN_OFF, TOOL_MEDIA_PAUSE, TOOL_MEDIA_UNPAUSE, TOOL_MEDIA_NEXT]
|
||||
if "volume_level" in extra_exposed_attributes:
|
||||
tools.append(TOOL_SET_VOLUME)
|
||||
return tools
|
||||
|
||||
|
||||
SUPPORTED_DEVICES: dict[str, DeviceType] = {
|
||||
"light": LightDeviceType(),
|
||||
"switch": SwitchDeviceType(),
|
||||
"fan": FanDeviceType(),
|
||||
"garage_door": GarageDoorDeviceType(),
|
||||
"blinds": BlindsDeviceType(),
|
||||
"lock": LockDeviceType(),
|
||||
"media_player": MediaPlayerDeviceType(),
|
||||
"climate": ClimateDeviceType(),
|
||||
"vacuum": VacuumDeviceType(),
|
||||
"timer": TimerDeviceType(),
|
||||
"todo": TodoDeviceType(),
|
||||
}
|
||||
|
||||
# generate a random list of devices for the context
|
||||
def random_device_list(max_devices: int, avoid_device_names: list[str], language: str = "english"):
|
||||
num_devices = random.randint(2, max_devices)
|
||||
piles = get_dataset_piles(language)
|
||||
|
||||
local_device_names = { k: v[:] for k,v in piles.stacks_of_device_names.items() }
|
||||
|
||||
avoid_climate = False
|
||||
for avoid_device in avoid_device_names:
|
||||
avoid_type = avoid_device.split(".")[0]
|
||||
|
||||
filtered_possible_devices = []
|
||||
for possible_device in local_device_names[avoid_type]:
|
||||
similarity_ratio = SequenceMatcher(None, avoid_device, possible_device["device_name"].split(".")[1]).ratio()
|
||||
|
||||
if similarity_ratio < 0.4:
|
||||
filtered_possible_devices.append(possible_device)
|
||||
local_device_names[avoid_type] = filtered_possible_devices
|
||||
|
||||
if avoid_type == "climate":
|
||||
avoid_climate = True
|
||||
|
||||
possible_choices: list[PileOfDeviceType] = []
|
||||
for device_type in local_device_names.keys():
|
||||
possible_choices.extend(local_device_names[device_type])
|
||||
|
||||
|
||||
device_types: set[str] = set()
|
||||
device_list = []
|
||||
device_lines: list[str] = []
|
||||
# TODO: randomly pick attributes for this list
|
||||
extra_exposed_attributes = ["rgb_color", "brightness", "temperature", "humidity", "fan_mode", "media_title", "volume_level", "duration", "remaining", "item"]
|
||||
|
||||
while len(device_list) < num_devices:
|
||||
choice = random.choice(possible_choices)
|
||||
if choice["device_name"] in device_list:
|
||||
continue
|
||||
|
||||
try:
|
||||
device_name = choice["device_name"]
|
||||
device_type = device_name.split(".")[0]
|
||||
friendly_name = choice["description"]
|
||||
|
||||
# don't add random thermostats. we need to be careful about how we handle multiple thermostats
|
||||
if avoid_climate and device_type == "climate":
|
||||
continue
|
||||
|
||||
state = SUPPORTED_DEVICES[device_type].get_random_state(language, extra_exposed_attributes=extra_exposed_attributes)
|
||||
device_lines.append(format_device_line(
|
||||
device_name=device_name,
|
||||
friendly_name=friendly_name,
|
||||
state=state
|
||||
))
|
||||
device_list.append(device_name)
|
||||
device_types.add(device_type)
|
||||
except Exception as ex:
|
||||
print(f"bad device name: {choice}")
|
||||
print(repr(ex))
|
||||
|
||||
return device_lines, list(device_types), list(extra_exposed_attributes)
|
||||
873
data/generate_data.py
Normal file
873
data/generate_data.py
Normal file
@@ -0,0 +1,873 @@
|
||||
import argparse
|
||||
import json
|
||||
import numpy as np
|
||||
import random
|
||||
from datasets import load_dataset, concatenate_datasets
|
||||
from typing import Any, Callable
|
||||
from tqdm import tqdm
|
||||
import webcolors
|
||||
|
||||
# ensure we can import from the data/ directory
|
||||
import os
|
||||
import sys
|
||||
sys.path.append(os.path.dirname(os.path.abspath(__file__)))
|
||||
|
||||
from devices import SUPPORTED_DEVICES, format_device_line, random_device_list, \
|
||||
TOOL_TURN_ON, TOOL_CLIMATE_SET_TEMPERATURE, TOOL_SET_HUMIDITY, \
|
||||
TOOL_LIGHT_SET, TOOL_START_TIMER, TOOL_LIST_ADD_ITEM, SERVICE_TO_TOOL_MAP, \
|
||||
HASS_TOOLS, SERVICE_TOOLS
|
||||
from prompting import generate_system_prompt, USER_INSTRUCTION_PROMPT
|
||||
from utils import AssistantTurn, DatasetEntry, Example, PileOfDeviceType, PileOfFailedToolcallType, PileOfRefusalsType, PileOfSpecificActionType, PileOfStatusRequestType, PileOfTemplatedActionType, ToolCall, ToolResult, get_random_response, generate_random_parameter, closest_color, \
|
||||
get_dataset_piles, NoResponseAvailableException
|
||||
|
||||
def create_assistant_turn(answer: str, tool_call_sequence: list[ToolCall] | None = None, *, tool_results: list[ToolResult] | None = None, train_on_turn: bool = True) -> AssistantTurn:
|
||||
"""Bundle the assistant utterance with any tool interaction for that turn."""
|
||||
return {
|
||||
"answer": answer,
|
||||
"tool_call_sequence": tool_call_sequence or [],
|
||||
"tool_results": tool_results if tool_results is not None else [],
|
||||
"train_on_turn": train_on_turn,
|
||||
}
|
||||
|
||||
def generate_static_example(action: PileOfSpecificActionType, persona: str, language: str, max_devices: int = 128, use_service_names: bool = False) -> Example:
|
||||
question = action["phrase"]
|
||||
service_name = action["service_name"]
|
||||
device_type = service_name.split(".")[0]
|
||||
target_device = f"{device_type}.{action['device_name']}"
|
||||
friendly_name = target_device.split(".")[1].replace("_", " ").title()
|
||||
piles = get_dataset_piles(language)
|
||||
|
||||
device_list, device_types, extra_exposed_attributes = random_device_list(
|
||||
max_devices=max_devices, avoid_device_names=[target_device], language=language)
|
||||
|
||||
# insert our target device somewhere random in the list
|
||||
index = random.randint(0, len(device_list))
|
||||
state = SUPPORTED_DEVICES[device_type].get_random_state(language, extra_exposed_attributes=extra_exposed_attributes)
|
||||
|
||||
device_list.insert(index, format_device_line(
|
||||
device_name=target_device,
|
||||
friendly_name=friendly_name,
|
||||
state=state
|
||||
))
|
||||
|
||||
# gather a list of all available tools
|
||||
available_tools: list[str] = []
|
||||
for x in set(device_types + [device_type]):
|
||||
available_tools.extend(SUPPORTED_DEVICES[x].get_all_tools(extra_exposed_attributes))
|
||||
|
||||
# Remove duplicates while preserving order
|
||||
available_tools = list(dict.fromkeys(available_tools))
|
||||
|
||||
# Map service name to tool name
|
||||
service_action = service_name.split(".")[1]
|
||||
tool_name = SERVICE_TO_TOOL_MAP[service_action]
|
||||
|
||||
response_starting, response_confirmed = get_random_response(
|
||||
piles.pile_of_responses,
|
||||
service=service_name,
|
||||
persona=persona,
|
||||
question_template="",
|
||||
short=False
|
||||
)
|
||||
|
||||
answer_list = [response_confirmed]
|
||||
tool_args = {}
|
||||
|
||||
question = question.replace("<device_name>", target_device)
|
||||
response_starting = response_starting.replace("<device_name>", target_device)
|
||||
answer_list = replace_answer(answer_list, "<device_name>", target_device)
|
||||
|
||||
if "climate" in service_action:
|
||||
if "<hvac_mode>" in question:
|
||||
hvac_mode = generate_random_parameter("hvac_mode", piles)
|
||||
question = question.replace("<hvac_mode>", hvac_mode)
|
||||
answer_list = replace_answer(answer_list, "<hvac_mode>", hvac_mode)
|
||||
# Add hvac_mode as temperature parameter for climate tool
|
||||
tool_args["hvac_mode"] = hvac_mode
|
||||
|
||||
if "<fan_mode>" in question:
|
||||
fan_mode = generate_random_parameter("fan_mode", piles)
|
||||
question = question.replace("<fan_mode>", fan_mode)
|
||||
answer_list = replace_answer(answer_list, "<fan_mode>", fan_mode)
|
||||
tool_args["fan_mode"] = fan_mode
|
||||
|
||||
if "<temp_f>" in question:
|
||||
temp_f = generate_random_parameter("temp_f", piles)
|
||||
question = question.replace("<temp_f>", str(temp_f))
|
||||
answer_list = replace_answer(answer_list, "<temp_f>", str(temp_f))
|
||||
tool_args["temperature"] = temp_f
|
||||
|
||||
if "<temp_c>" in question:
|
||||
temp_c = generate_random_parameter("temp_c", piles)
|
||||
question = question.replace("<temp_c>", str(temp_c))
|
||||
answer_list = replace_answer(answer_list, "<temp_c>", str(temp_c))
|
||||
tool_args["temperature"] = temp_c
|
||||
|
||||
if "<humidity>" in question:
|
||||
humidity = generate_random_parameter("humidity", piles)
|
||||
question = question.replace("<humidity>", str(humidity))
|
||||
answer_list = replace_answer(answer_list, "<humidity>", str(humidity))
|
||||
tool_args["humidity"] = humidity
|
||||
|
||||
if "light" in service_action:
|
||||
if "<brightness>" in question:
|
||||
brightness = generate_random_parameter("brightness", piles)
|
||||
question = question.replace("<brightness>", str(brightness))
|
||||
answer_list = replace_answer(answer_list, "<brightness>", str(brightness))
|
||||
tool_args["brightness"] = brightness
|
||||
|
||||
if "<color>" in question:
|
||||
random_rgb = generate_random_parameter("rgb_color", piles)
|
||||
random_rgb_name = closest_color(random_rgb)
|
||||
question = question.replace("<color>", str(random_rgb_name))
|
||||
answer_list = replace_answer(answer_list, "<color>", str(random_rgb_name))
|
||||
tool_args["color"] = random_rgb_name
|
||||
|
||||
if "timer" in service_action:
|
||||
if "<duration>" in question:
|
||||
duration = generate_random_parameter("duration", piles)
|
||||
duration_name = piles.pile_of_durations[duration]
|
||||
question = question.replace("<duration>", duration_name)
|
||||
answer_list = replace_answer(answer_list, "<duration>", duration_name)
|
||||
tool_args["duration"] = str(duration)
|
||||
|
||||
if "todo" in service_action:
|
||||
if "<todo>" in question:
|
||||
todo = generate_random_parameter("todo", piles)
|
||||
question = question.replace("<todo>", todo)
|
||||
answer_list = replace_answer(answer_list, "<todo>", todo)
|
||||
tool_args["item"] = todo
|
||||
|
||||
if use_service_names:
|
||||
tool_call: ToolCall = {
|
||||
"tool_name": tool_name,
|
||||
"service_name": service_name,
|
||||
"tool_args": {"entity_id": target_device, **tool_args}
|
||||
}
|
||||
else:
|
||||
tool_call: ToolCall = {
|
||||
"tool_name": tool_name,
|
||||
"service_name": service_name,
|
||||
"tool_args": {"name": target_device, **tool_args}
|
||||
}
|
||||
|
||||
if "arguments" in action and action["arguments"]:
|
||||
try:
|
||||
import json
|
||||
args = json.loads(action["arguments"])
|
||||
tool_call["tool_args"].update(args)
|
||||
except Exception as e:
|
||||
print(f"Failed to parse arguments for {action}: {e}")
|
||||
|
||||
final_answer = " ".join(answer_list)
|
||||
assistant_turns = [
|
||||
create_assistant_turn(response_starting, [tool_call]),
|
||||
create_assistant_turn(final_answer, [])
|
||||
]
|
||||
|
||||
return {
|
||||
"states": device_list,
|
||||
"available_tools": available_tools,
|
||||
"question": question.lower(),
|
||||
"assistant_turns": assistant_turns
|
||||
}
|
||||
|
||||
def replace_answer(list_of_answer: list[str], var: str, value: str):
|
||||
new_list: list[str] = []
|
||||
for answer in list_of_answer:
|
||||
new_list.append(answer.replace(var, value))
|
||||
return new_list
|
||||
|
||||
def generate_templated_example(template: PileOfTemplatedActionType, persona: str, language: str, max_devices: int = 128, use_service_names: bool = False) -> Example:
|
||||
template_device_types: list[str] = template["device_type"].split("|")
|
||||
service_names: list[str] = [ f"{x}.{y}" for x, y in zip(template_device_types, template["service"].split("|")) ]
|
||||
question_template: str = template["phrase"]
|
||||
piles = get_dataset_piles(language)
|
||||
|
||||
# choose a random device for this template
|
||||
chosen_devices: list[PileOfDeviceType] = []
|
||||
for device_type in template_device_types:
|
||||
device_dict = random.choice(piles.stacks_of_device_names[device_type])
|
||||
chosen_devices.append(device_dict)
|
||||
|
||||
device_list, device_types, extra_exposed_attributes = random_device_list(
|
||||
max_devices=max_devices, avoid_device_names=[d["device_name"] for d in chosen_devices])
|
||||
|
||||
# insert our target device somewhere random in the list
|
||||
for device_dict in chosen_devices:
|
||||
index = random.randint(0, len(device_list))
|
||||
if "<brightness>" in question_template and "brightness" not in extra_exposed_attributes:
|
||||
extra_exposed_attributes.append("brightness")
|
||||
if "<color>" in question_template and "rgb_color" not in extra_exposed_attributes:
|
||||
extra_exposed_attributes.append("rgb_color")
|
||||
if ("<temp_f>" in question_template or "<temp_c>" in question_template) \
|
||||
and "temperature" not in extra_exposed_attributes:
|
||||
extra_exposed_attributes.append("temperature")
|
||||
if "<humidity>" in question_template and "humidity" not in extra_exposed_attributes:
|
||||
extra_exposed_attributes.append("humidity")
|
||||
if "<fan_mode>" in question_template and "fan_mode" not in extra_exposed_attributes:
|
||||
extra_exposed_attributes.append("fan_mode")
|
||||
if "<duration>" in question_template and "duration" not in extra_exposed_attributes:
|
||||
extra_exposed_attributes.append("duration")
|
||||
|
||||
state = SUPPORTED_DEVICES[device_dict["type"]].get_random_state(language, extra_exposed_attributes=extra_exposed_attributes)
|
||||
device_name = device_dict["device_name"]
|
||||
friendly_name = device_dict["description"]
|
||||
|
||||
device_list.insert(index, format_device_line(
|
||||
device_name=device_name,
|
||||
friendly_name=friendly_name,
|
||||
state=state
|
||||
))
|
||||
|
||||
# gather a list of all available tools
|
||||
available_tools: list[str] = []
|
||||
for x in set(device_types + template_device_types):
|
||||
available_tools.extend(SUPPORTED_DEVICES[x].get_all_tools(extra_exposed_attributes))
|
||||
|
||||
# Remove duplicates while preserving order
|
||||
available_tools = list(dict.fromkeys(available_tools))
|
||||
|
||||
# pick an appropriate response and generate the question
|
||||
if len(template_device_types) == 1:
|
||||
answer_starting, answer_confirmed = get_random_response(
|
||||
piles.pile_of_responses,
|
||||
service=service_names[0],
|
||||
persona=persona,
|
||||
question_template=question_template,
|
||||
short=False
|
||||
)
|
||||
|
||||
question = question_template.replace("<device_name>", chosen_devices[0]["description"])
|
||||
answer_starting = answer_starting.replace("<device_name>", chosen_devices[0]["description"])
|
||||
answer_list = [ answer_confirmed.replace("<device_name>", chosen_devices[0]["description"]) ]
|
||||
else:
|
||||
question = question_template
|
||||
answers = []
|
||||
answer_starting = ""
|
||||
for i in range(len(template_device_types)):
|
||||
question = question.replace(f"<device_name{(i + 1)}>", chosen_devices[i]["description"])
|
||||
answer_starting_part, answer_confirmed = get_random_response(
|
||||
piles.pile_of_responses,
|
||||
service=service_names[i],
|
||||
persona=persona,
|
||||
question_template=question_template,
|
||||
short=True
|
||||
)
|
||||
answer_starting += answer_starting_part.replace(f"<device_name>", chosen_devices[i]["description"]) + " "
|
||||
answers.append(answer_confirmed.replace(f"<device_name>", chosen_devices[i]["description"]))
|
||||
|
||||
answer_list = []
|
||||
for word in piles.and_words:
|
||||
answer_list.append(f" {word} ".join(answers))
|
||||
|
||||
# generate the list of tool calls
|
||||
tool_calls: list[ToolCall] = []
|
||||
for device_dict, service in zip(chosen_devices, service_names):
|
||||
service_action = service.split(".")[1]
|
||||
tool_name = SERVICE_TO_TOOL_MAP[service_action]
|
||||
tool_call: ToolCall = {
|
||||
"tool_name": tool_name,
|
||||
"service_name": service,
|
||||
"tool_args": {"entity_id" if use_service_names else "name": device_dict["device_name"] if use_service_names else device_dict["description"]}
|
||||
}
|
||||
tool_calls.append(tool_call)
|
||||
|
||||
if any(["climate" in service for service in service_names ]):
|
||||
if "<hvac_mode>" in question:
|
||||
hvac_mode = generate_random_parameter("hvac_mode", piles)
|
||||
question = question.replace("<hvac_mode>", hvac_mode)
|
||||
answer_list = replace_answer(answer_list, "<hvac_mode>", hvac_mode)
|
||||
# Add hvac_mode as temperature parameter for climate tool
|
||||
for call in tool_calls:
|
||||
if call["tool_name"] == TOOL_CLIMATE_SET_TEMPERATURE:
|
||||
call["tool_args"]["hvac_mode"] = hvac_mode
|
||||
|
||||
if "<fan_mode>" in question:
|
||||
fan_mode = generate_random_parameter("fan_mode", piles)
|
||||
question = question.replace("<fan_mode>", fan_mode)
|
||||
answer_list = replace_answer(answer_list, "<fan_mode>", fan_mode)
|
||||
for call in tool_calls:
|
||||
if call["tool_name"] == TOOL_CLIMATE_SET_TEMPERATURE:
|
||||
call["tool_args"]["fan_mode"] = fan_mode
|
||||
|
||||
if "<temp_f>" in question:
|
||||
temp_f = generate_random_parameter("temp_f", piles)
|
||||
question = question.replace("<temp_f>", str(temp_f))
|
||||
answer_list = replace_answer(answer_list, "<temp_f>", str(temp_f))
|
||||
for call in tool_calls:
|
||||
if call["tool_name"] == TOOL_CLIMATE_SET_TEMPERATURE:
|
||||
call["tool_args"]["temperature"] = temp_f
|
||||
|
||||
if "<temp_c>" in question:
|
||||
temp_c = generate_random_parameter("temp_c", piles)
|
||||
question = question.replace("<temp_c>", str(temp_c))
|
||||
answer_list = replace_answer(answer_list, "<temp_c>", str(temp_c))
|
||||
for call in tool_calls:
|
||||
if call["tool_name"] == TOOL_CLIMATE_SET_TEMPERATURE:
|
||||
call["tool_args"]["temperature"] = temp_c
|
||||
|
||||
if "<humidity>" in question:
|
||||
humidity = generate_random_parameter("humidity", piles)
|
||||
question = question.replace("<humidity>", str(humidity))
|
||||
answer_list = replace_answer(answer_list, "<humidity>", str(humidity))
|
||||
for call in tool_calls:
|
||||
if call["tool_name"] == TOOL_SET_HUMIDITY:
|
||||
call["tool_args"]["humidity"] = humidity
|
||||
|
||||
if any(["light" in service for service in service_names ]):
|
||||
if "<brightness>" in question:
|
||||
brightness = generate_random_parameter("brightness", piles)
|
||||
question = question.replace("<brightness>", str(brightness))
|
||||
answer_list = replace_answer(answer_list, "<brightness>", str(brightness))
|
||||
for call in tool_calls:
|
||||
if call["tool_name"] == TOOL_LIGHT_SET:
|
||||
call["tool_args"]["brightness"] = brightness
|
||||
|
||||
if "<color>" in question:
|
||||
random_rgb = generate_random_parameter("rgb_color", piles)
|
||||
random_rgb_name = closest_color(random_rgb)
|
||||
question = question.replace("<color>", str(random_rgb_name))
|
||||
answer_list = replace_answer(answer_list, "<color>", str(random_rgb_name))
|
||||
for call in tool_calls:
|
||||
if call["tool_name"] == TOOL_LIGHT_SET:
|
||||
call["tool_args"]["color"] = random_rgb_name
|
||||
|
||||
if any(["timer" in service for service in service_names ]):
|
||||
if "<duration>" in question:
|
||||
duration = generate_random_parameter("duration", piles)
|
||||
duration_name = piles.pile_of_durations[duration]
|
||||
question = question.replace("<duration>", duration_name)
|
||||
answer_list = replace_answer(answer_list, "<duration>", duration_name)
|
||||
for call in tool_calls:
|
||||
if call["tool_name"] == TOOL_START_TIMER:
|
||||
call["tool_args"]["duration"] = str(duration)
|
||||
|
||||
if any(["todo" in service for service in service_names ]):
|
||||
if "<todo>" in question:
|
||||
todo = generate_random_parameter("todo", piles)
|
||||
question = question.replace("<todo>", todo)
|
||||
answer_list = replace_answer(answer_list, "<todo>", todo)
|
||||
for call in tool_calls:
|
||||
if call["tool_name"] == TOOL_LIST_ADD_ITEM:
|
||||
call["tool_args"]["item"] = todo
|
||||
|
||||
starting_answer = answer_starting.strip().lower()
|
||||
normalized_answers = [ sentence.lower() for sentence in answer_list ]
|
||||
final_answer = " ".join(normalized_answers)
|
||||
assistant_turns = [
|
||||
create_assistant_turn(starting_answer, tool_calls),
|
||||
create_assistant_turn(final_answer, [])
|
||||
]
|
||||
|
||||
return {
|
||||
"states": device_list,
|
||||
"available_tools": available_tools,
|
||||
"question": question.lower(),
|
||||
"assistant_turns": assistant_turns
|
||||
}
|
||||
|
||||
def generate_status_request(template: PileOfStatusRequestType, persona: str, language: str, max_devices: int = 128, return_target_device: bool = False, use_service_names: bool = False) -> Example | tuple[Example, PileOfDeviceType]:
|
||||
device_type: str = template["device_type"]
|
||||
state_name: str = template["state"]
|
||||
question_template: str = template["phrase"]
|
||||
answer_template: str = template["assistant_response"]
|
||||
piles = get_dataset_piles(language)
|
||||
|
||||
# choose a random device for this template
|
||||
chosen_device = random.choice(piles.stacks_of_device_names[device_type])
|
||||
|
||||
# build a random list of devices
|
||||
device_list, device_types, extra_exposed_attributes = random_device_list(max_devices=max_devices, avoid_device_names=[ chosen_device["device_name"] ])
|
||||
|
||||
# generate the question
|
||||
question = question_template.replace("<device_name>", chosen_device["description"])
|
||||
answer = answer_template.replace("<device_name>", chosen_device["description"])
|
||||
|
||||
# insert other templated variables
|
||||
if device_type == "climate":
|
||||
climate_device_type = SUPPORTED_DEVICES["climate"]
|
||||
temp_f = climate_device_type.get_random_parameter("temp_f", language)
|
||||
answer = answer.replace("<temp_f>", str(temp_f))
|
||||
state_name = state_name.replace("<temp_f>", str(temp_f))
|
||||
|
||||
temp_c = climate_device_type.get_random_parameter("temp_c", language)
|
||||
answer = answer.replace("<temp_c>", str(temp_c))
|
||||
state_name = state_name.replace("<temp_c>", str(temp_c))
|
||||
|
||||
humidity = climate_device_type.get_random_parameter("humidity", language)
|
||||
answer = answer.replace("<humidity>", str(humidity))
|
||||
state_name = state_name.replace("<humidity>", str(humidity))
|
||||
|
||||
if device_type == "light":
|
||||
light_device_type = SUPPORTED_DEVICES["light"]
|
||||
|
||||
brightness = light_device_type.get_random_parameter("brightness", language)
|
||||
answer = answer.replace("<brightness>", str(brightness))
|
||||
state_name = state_name.replace("<brightness>", str(brightness))
|
||||
|
||||
random_rgb = light_device_type.get_random_parameter("rgb_color", language)
|
||||
random_rgb_name = closest_color(random_rgb)
|
||||
actual_random_rgb = webcolors.name_to_rgb(random_rgb_name)
|
||||
actual_random_rgb = (actual_random_rgb.red, actual_random_rgb.green, actual_random_rgb.blue)
|
||||
state_name = state_name.replace("<color>", str(random_rgb_name) + " " + str(actual_random_rgb))
|
||||
answer = answer.replace("<color>", str(random_rgb_name))
|
||||
|
||||
if device_type == "media_player":
|
||||
media_player_device_type = SUPPORTED_DEVICES["media_player"]
|
||||
volume = media_player_device_type.get_random_parameter("volume", language)
|
||||
random_media = media_player_device_type.get_random_parameter("media", language)
|
||||
|
||||
answer = answer.replace("<volume>", str(volume) + "%")
|
||||
state_name = state_name.replace("<volume>", str(volume) + "%")
|
||||
|
||||
answer = answer.replace("<media>", random_media)
|
||||
state_name = state_name.replace("<media>", random_media)
|
||||
|
||||
if device_type == "timer":
|
||||
timer_device_type = SUPPORTED_DEVICES["timer"]
|
||||
duration = timer_device_type.get_random_parameter("duration", language)
|
||||
duration_name = piles.pile_of_durations[duration]
|
||||
remaining = timer_device_type.get_random_parameter("remaining", language)
|
||||
|
||||
answer = answer.replace("<duration>", duration_name)
|
||||
state_name = state_name.replace("<duration>", duration)
|
||||
|
||||
answer = answer.replace("<remaining>", remaining)
|
||||
state_name = state_name.replace("<remaining>", remaining)
|
||||
|
||||
# insert our target device somewhere random in the list
|
||||
index = random.randint(0, len(device_list))
|
||||
device_list.insert(index, format_device_line(
|
||||
device_name=chosen_device["device_name"],
|
||||
friendly_name=chosen_device["description"],
|
||||
state=state_name
|
||||
))
|
||||
|
||||
# gather a list of all available tools
|
||||
available_tools: list[str] = []
|
||||
for x in set(device_types + [device_type]):
|
||||
available_tools.extend(SUPPORTED_DEVICES[x].get_all_tools(extra_exposed_attributes))
|
||||
|
||||
# Remove duplicates while preserving order
|
||||
available_tools = list(dict.fromkeys(available_tools))
|
||||
|
||||
assistant_turns = [create_assistant_turn(answer.lower(), [])]
|
||||
|
||||
result: Example = {
|
||||
"states": device_list,
|
||||
"available_tools": available_tools,
|
||||
"question": question.lower(),
|
||||
"assistant_turns": assistant_turns
|
||||
}
|
||||
if return_target_device:
|
||||
return result, chosen_device
|
||||
else:
|
||||
return result
|
||||
|
||||
def generate_tool_failure_example(failure_case: PileOfFailedToolcallType, persona: str, language: str, max_devices: int = 128, use_service_names: bool = False) -> Example:
|
||||
piles = get_dataset_piles(language)
|
||||
service_name = failure_case["service_name"]
|
||||
device_type = service_name.split(".")[0]
|
||||
service_action = service_name.split(".")[1]
|
||||
target_device = failure_case["correct_device_name"]
|
||||
friendly_name = failure_case.get("correct_friendly_name", target_device.split(".")[1].replace("_", " ").title())
|
||||
bad_device = failure_case["bad_device_name"]
|
||||
|
||||
question_template = failure_case["phrase"]
|
||||
question = question_template.replace("<device_name>", friendly_name).lower()
|
||||
|
||||
device_list, device_types, extra_exposed_attributes = random_device_list(
|
||||
max_devices=max_devices, avoid_device_names=[target_device], language=language)
|
||||
|
||||
state = SUPPORTED_DEVICES[device_type].get_random_state(language, extra_exposed_attributes=extra_exposed_attributes)
|
||||
device_list.insert(random.randint(0, len(device_list)), format_device_line(
|
||||
device_name=target_device,
|
||||
friendly_name=friendly_name,
|
||||
state=state
|
||||
))
|
||||
if device_type not in device_types:
|
||||
device_types.append(device_type)
|
||||
|
||||
available_tools: list[str] = []
|
||||
for x in set(device_types):
|
||||
available_tools.extend(SUPPORTED_DEVICES[x].get_all_tools(extra_exposed_attributes))
|
||||
available_tools = list(dict.fromkeys(available_tools))
|
||||
|
||||
response_starting, response_confirmed = get_random_response(
|
||||
piles.pile_of_responses,
|
||||
service=service_name,
|
||||
persona=persona,
|
||||
question_template=question_template,
|
||||
short=False
|
||||
)
|
||||
response_starting = response_starting.replace("<device_name>", friendly_name)
|
||||
response_confirmed = response_confirmed.replace("<device_name>", friendly_name)
|
||||
|
||||
tool_args_extra: dict[str, Any] = {}
|
||||
if device_type == "climate":
|
||||
if "<temp_f>" in question or "<temp_f>" in response_starting or "<temp_f>" in response_confirmed:
|
||||
temp_f = generate_random_parameter("temp_f", piles)
|
||||
question = question.replace("<temp_f>", str(temp_f))
|
||||
response_starting = response_starting.replace("<temp_f>", str(temp_f))
|
||||
response_confirmed = response_confirmed.replace("<temp_f>", str(temp_f))
|
||||
tool_args_extra["temperature"] = temp_f
|
||||
if "<temp_c>" in question or "<temp_c>" in response_starting or "<temp_c>" in response_confirmed:
|
||||
temp_c = generate_random_parameter("temp_c", piles)
|
||||
question = question.replace("<temp_c>", str(temp_c))
|
||||
response_starting = response_starting.replace("<temp_c>", str(temp_c))
|
||||
response_confirmed = response_confirmed.replace("<temp_c>", str(temp_c))
|
||||
tool_args_extra["temperature"] = temp_c
|
||||
|
||||
retry_prompt = failure_case.get("retry_prompt", f"Trying again with {friendly_name}.").replace("<device_name>", friendly_name)
|
||||
error_result = failure_case.get("error_result", "Error").replace("<device_name>", friendly_name)
|
||||
|
||||
tool_name = SERVICE_TO_TOOL_MAP[service_action]
|
||||
first_args = {"entity_id": bad_device} if use_service_names else {"name": bad_device}
|
||||
retry_args = {"entity_id": target_device} if use_service_names else {"name": target_device}
|
||||
first_args.update(tool_args_extra)
|
||||
retry_args.update(tool_args_extra)
|
||||
|
||||
first_turn = create_assistant_turn(
|
||||
response_starting,
|
||||
[{
|
||||
"tool_name": tool_name,
|
||||
"service_name": service_name,
|
||||
"tool_args": first_args
|
||||
}],
|
||||
tool_results=[{
|
||||
"tool_name": service_name if use_service_names else tool_name,
|
||||
"tool_result": error_result
|
||||
}],
|
||||
train_on_turn=False
|
||||
)
|
||||
|
||||
second_turn = create_assistant_turn(
|
||||
retry_prompt,
|
||||
[{
|
||||
"tool_name": tool_name,
|
||||
"service_name": service_name,
|
||||
"tool_args": retry_args
|
||||
}]
|
||||
)
|
||||
|
||||
final_turn = create_assistant_turn(response_confirmed, [])
|
||||
|
||||
return {
|
||||
"states": device_list,
|
||||
"available_tools": available_tools,
|
||||
"question": question,
|
||||
"assistant_turns": [first_turn, second_turn, final_turn]
|
||||
}
|
||||
|
||||
def generate_refusal_example(refusal_case: PileOfRefusalsType, persona: str, language: str, max_devices: int = 128, use_service_names: bool = False) -> Example:
|
||||
service_name = refusal_case["service_name"]
|
||||
device_type = service_name.split(".")[0]
|
||||
target_device = f"{device_type}.{refusal_case['device_name']}"
|
||||
friendly_name = refusal_case.get("friendly_name", refusal_case["device_name"].replace("_", " ").title())
|
||||
desired_state = refusal_case.get("desired_state", "")
|
||||
reason_type = refusal_case.get("reason_type", "not_available")
|
||||
|
||||
device_list, device_types, extra_exposed_attributes = random_device_list(
|
||||
max_devices=max_devices, avoid_device_names=[target_device], language=language)
|
||||
|
||||
if reason_type == "already_state":
|
||||
state = desired_state if desired_state else SUPPORTED_DEVICES[device_type].possible_states[0][0]
|
||||
device_list.insert(random.randint(0, len(device_list)), format_device_line(
|
||||
device_name=target_device,
|
||||
friendly_name=friendly_name,
|
||||
state=state
|
||||
))
|
||||
if device_type not in device_types:
|
||||
device_types.append(device_type)
|
||||
|
||||
available_tools: list[str] = []
|
||||
for x in set(device_types):
|
||||
available_tools.extend(SUPPORTED_DEVICES[x].get_all_tools(extra_exposed_attributes))
|
||||
available_tools = list(dict.fromkeys(available_tools))
|
||||
|
||||
response_text = refusal_case["response"].replace("<device_name>", friendly_name).lower()
|
||||
question = refusal_case["phrase"].replace("<device_name>", friendly_name).lower()
|
||||
|
||||
assistant_turns = [create_assistant_turn(response_text, [])]
|
||||
|
||||
return {
|
||||
"states": device_list,
|
||||
"available_tools": available_tools,
|
||||
"question": question,
|
||||
"assistant_turns": assistant_turns
|
||||
}
|
||||
|
||||
def format_example_sharegpt(example: Example, persona: str, language: str, use_system_role: bool, append_user_instruction_prompt: bool, use_service_names: bool, tool_response_format: str) -> DatasetEntry:
|
||||
piles = get_dataset_piles(language)
|
||||
sys_prompt = generate_system_prompt(example, persona, language, piles.pile_of_system_prompts)
|
||||
question = example["question"]
|
||||
assistant_turns = example["assistant_turns"]
|
||||
|
||||
if append_user_instruction_prompt:
|
||||
user_instruction_words = USER_INSTRUCTION_PROMPT[language] + ":"
|
||||
sys_prompt = "\n".join([ sys_prompt, user_instruction_words ])
|
||||
|
||||
if use_system_role:
|
||||
conversation = [
|
||||
{
|
||||
"role": "system",
|
||||
"content": [{"type": "text", "text": sys_prompt}],
|
||||
"train_on_turn": False,
|
||||
},
|
||||
{
|
||||
"role": "user",
|
||||
"content": [{ "type": "text", "text": question }],
|
||||
"train_on_turn": False,
|
||||
}
|
||||
]
|
||||
else:
|
||||
conversation = [
|
||||
{
|
||||
"role": "user",
|
||||
"content": [{ "type": "text", "text": "\n".join([ sys_prompt, question ]) }],
|
||||
"train_on_turn": False,
|
||||
}
|
||||
]
|
||||
|
||||
call_id_counter = 1
|
||||
for turn in assistant_turns:
|
||||
answer_text = turn.get("answer", "")
|
||||
assistant_block = {
|
||||
"role": "assistant",
|
||||
"content": [{ "type": "text", "text": answer_text }],
|
||||
"train_on_turn": turn.get("train_on_turn", True),
|
||||
}
|
||||
|
||||
tool_call_sequence = turn.get("tool_call_sequence", [])
|
||||
formatted_calls = []
|
||||
call_names = []
|
||||
for tool_call in tool_call_sequence:
|
||||
call_name = tool_call.get("service_name", tool_call["tool_name"]) if use_service_names else tool_call["tool_name"]
|
||||
call_names.append(call_name)
|
||||
formatted_calls.append({
|
||||
"name": call_name,
|
||||
"arguments": json.dumps(tool_call["tool_args"]),
|
||||
})
|
||||
|
||||
if formatted_calls:
|
||||
assistant_block["tool_calls"] = [{ "function": call } for call in formatted_calls]
|
||||
|
||||
conversation.append(assistant_block)
|
||||
|
||||
if formatted_calls:
|
||||
provided_results = turn.get("tool_results") or []
|
||||
step_tool_results = []
|
||||
|
||||
if provided_results:
|
||||
for idx, provided in enumerate(provided_results):
|
||||
result = dict(provided)
|
||||
if "tool_name" not in result and call_names:
|
||||
result["tool_name"] = call_names[min(idx, len(call_names) - 1)]
|
||||
if "tool_call_id" not in result:
|
||||
result["tool_call_id"] = f"call_{call_id_counter}"
|
||||
call_id_counter += 1
|
||||
step_tool_results.append(result)
|
||||
else:
|
||||
for call_name in call_names:
|
||||
step_tool_results.append({
|
||||
"tool_name": call_name,
|
||||
"tool_call_id": f"call_{call_id_counter}",
|
||||
"tool_result": "Success"
|
||||
})
|
||||
call_id_counter += 1
|
||||
|
||||
if tool_response_format == "text":
|
||||
conversation.append({
|
||||
"role": "tool",
|
||||
"content": [{ "type": "text", "text": json.dumps(result) } for result in step_tool_results],
|
||||
"train_on_turn": False,
|
||||
})
|
||||
elif tool_response_format == "functiongemma":
|
||||
conversation.append({
|
||||
"role": "tool",
|
||||
"content": [{ "name": result["tool_name"], "response": {"result": result["tool_result"]} } for result in step_tool_results],
|
||||
"train_on_turn": False,
|
||||
})
|
||||
|
||||
return {
|
||||
"messages": conversation,
|
||||
"tools": SERVICE_TOOLS if use_service_names else HASS_TOOLS
|
||||
}
|
||||
|
||||
def generate_sft_file(
|
||||
filename: str,
|
||||
seed: int,
|
||||
format_func: Callable[[Example, str, str, bool, bool, bool, str], DatasetEntry],
|
||||
use_system_role: bool,
|
||||
append_user_instruction_prompt: bool,
|
||||
use_service_names: bool,
|
||||
personas: list[str],
|
||||
language: str,
|
||||
tool_response_format: str,
|
||||
*,
|
||||
static_factor: float,
|
||||
template_factor: int,
|
||||
status_request_factor: int,
|
||||
failure_factor: int,
|
||||
refusal_factor: int):
|
||||
random.seed(seed)
|
||||
np.random.seed(seed)
|
||||
piles = get_dataset_piles(language)
|
||||
|
||||
print("Generating...")
|
||||
|
||||
def run_factor_times(func: Callable[..., Example], examples: list[DatasetEntry], data, persona: str, factor: int | float, language: str):
|
||||
if factor >= 1:
|
||||
for i in range(int(factor)):
|
||||
examples.append(format_func(func(data, persona, language, use_service_names=use_service_names), persona, language, use_system_role, append_user_instruction_prompt, use_service_names, tool_response_format))
|
||||
else:
|
||||
if random.random() < factor:
|
||||
examples.append(format_func(func(data, persona, language, use_service_names=use_service_names), persona, language, use_system_role, append_user_instruction_prompt, use_service_names, tool_response_format))
|
||||
|
||||
generated_examples: list[DatasetEntry] = []
|
||||
|
||||
missing_responses = set()
|
||||
|
||||
for person in personas:
|
||||
for action in tqdm(piles.pile_of_specific_actions):
|
||||
try:
|
||||
run_factor_times(generate_static_example, generated_examples, action, person, static_factor, language)
|
||||
except NoResponseAvailableException as ex:
|
||||
missing_responses.add(str(ex))
|
||||
|
||||
for templated_action in tqdm(piles.pile_of_templated_actions):
|
||||
try:
|
||||
run_factor_times(generate_templated_example, generated_examples, templated_action, person, template_factor, language)
|
||||
except NoResponseAvailableException as ex:
|
||||
missing_responses.add(str(ex))
|
||||
|
||||
for failure_case in tqdm(piles.pile_of_failed_tool_calls):
|
||||
try:
|
||||
run_factor_times(generate_tool_failure_example, generated_examples, failure_case, person, failure_factor, language)
|
||||
except NoResponseAvailableException as ex:
|
||||
missing_responses.add(str(ex))
|
||||
|
||||
for refusal_case in tqdm(piles.pile_of_refusals):
|
||||
try:
|
||||
run_factor_times(generate_refusal_example, generated_examples, refusal_case, person, refusal_factor, language)
|
||||
except NoResponseAvailableException as ex:
|
||||
missing_responses.add(str(ex))
|
||||
|
||||
for status_request in tqdm(piles.pile_of_status_requests):
|
||||
run_factor_times(generate_status_request, generated_examples, status_request, "assistant", status_request_factor, language)
|
||||
|
||||
print(f"Generated {len(generated_examples)} examples. Saving...")
|
||||
|
||||
for missing in sorted(missing_responses):
|
||||
print(missing)
|
||||
|
||||
cwd = os.path.dirname(__file__)
|
||||
with open(f"{cwd}/output/{filename}.jsonl", "w") as f:
|
||||
for item in generated_examples:
|
||||
json_record = json.dumps(item)
|
||||
f.write(json_record + '\n')
|
||||
|
||||
print("Done!")
|
||||
|
||||
def merge_with_dataset(dataset_name, seed, output_name, format_function, dataset_column_names, format_func):
|
||||
alpaca_dataset = load_dataset(dataset_name)["train"].train_test_split(test_size=0.1)
|
||||
home_assistant_dataset = load_dataset("json", data_files={ "train": "home_assistant_train.jsonl", "test": "home_assistant_test.jsonl" })
|
||||
|
||||
random.seed(seed)
|
||||
np.random.seed(seed)
|
||||
|
||||
alpaca_dataset = alpaca_dataset.map(format_function).remove_columns(dataset_column_names)
|
||||
|
||||
combined_dataset_train = concatenate_datasets([home_assistant_dataset["train"], alpaca_dataset["train"]]).shuffle(seed=42)
|
||||
combined_dataset_test = concatenate_datasets([home_assistant_dataset["test"], alpaca_dataset["test"]]).shuffle(seed=42)
|
||||
|
||||
combined_dataset_train.to_json(f"home_assistant_{output_name}_merged_train.jsonl")
|
||||
combined_dataset_test.to_json(f"home_assistant_{output_name}_merged_test.jsonl")
|
||||
|
||||
def merge_languages(filename_prefix: str, languages: list):
|
||||
all_examples = []
|
||||
cwd = os.path.dirname(__file__)
|
||||
|
||||
for language in languages:
|
||||
with open(f"{cwd}/output/{filename_prefix}_{language}.jsonl") as f:
|
||||
all_examples.extend(f.readlines())
|
||||
|
||||
with open(f"{cwd}/output/{filename_prefix}.jsonl", "w") as f:
|
||||
f.writelines(all_examples)
|
||||
|
||||
|
||||
# TODO: add examples for ambiguous requests. asking a clarifying question
|
||||
# TODO: support rejection when asking to do a service that isn't exposed
|
||||
# TODO: make more randomized names for devices (random words or people's names)
|
||||
# TODO: answer questions about more than one thing in the state list at once
|
||||
# TODO: add examples for rooms/groups of devices. i.e. "turn off all the lights in the kitchen"
|
||||
# TODO: add time, weather, and calendar/reminders (next 3 events?)
|
||||
def main(args=None):
|
||||
parser = argparse.ArgumentParser(description="Generate the full dataset from the CSV piles")
|
||||
parser.add_argument("--sample", action="store_true", help="Set this flag to enable generation of the train dataset.")
|
||||
parser.add_argument("--test", action="store_true", help="Set this flag to enable generation of the train dataset.")
|
||||
parser.add_argument("--train", action="store_true", help="Set this flag to enable generation of the train dataset.")
|
||||
parser.add_argument("--language", nargs="+", default=["english"], help="List of languages to generate: english, german, french, spanish, polish")
|
||||
parser.add_argument("--tool-response-format", default="text", choices=["text", "functiongemma"], help="Format to use for tool responses.")
|
||||
|
||||
role_tweaks = parser.add_mutually_exclusive_group()
|
||||
role_tweaks.add_argument("--no-system-role", action="store_true", help="Set this flag to disable the system role. The house context will be combined with the user role")
|
||||
role_tweaks.add_argument("--merged-system-role", action="store_true", help="Set this flag to still emit a system role, but assume it will be merged by the chat template into the user role.")
|
||||
|
||||
train_size_group = parser.add_mutually_exclusive_group()
|
||||
train_size_group.add_argument('--small', action='store_const', const='small', dest='size')
|
||||
train_size_group.add_argument('--medium', action='store_const', const='medium', dest='size')
|
||||
train_size_group.add_argument('--large', action='store_const', const='large', dest='size')
|
||||
train_size_group.add_argument('--xl', action='store_const', const='xl', dest='size')
|
||||
|
||||
parser.add_argument('--use-service-names', action='store_true',
|
||||
help='Use service names (e.g., light.turn_on) instead of intent tool names (e.g., HassTurnOn)')
|
||||
|
||||
args = parser.parse_args(args=args)
|
||||
|
||||
if not args.sample and not args.train and not args.test:
|
||||
parser.print_usage()
|
||||
exit(-1)
|
||||
|
||||
if args.size and not args.train:
|
||||
print("Train size was provided but not generating the training set!")
|
||||
exit(-1)
|
||||
|
||||
format_func = format_example_sharegpt
|
||||
|
||||
use_system_role = not args.no_system_role
|
||||
append_user_instruction_prompt = args.merged_system_role or not args.no_system_role
|
||||
use_service_names = args.use_service_names
|
||||
tool_response_format = args.tool_response_format
|
||||
|
||||
for language in args.language:
|
||||
piles = get_dataset_piles(language)
|
||||
personas = list(piles.pile_of_system_prompts.keys())
|
||||
suffix = f"_{language}" if len(args.language) > 1 else ""
|
||||
|
||||
if args.sample:
|
||||
generate_sft_file(f"sample{suffix}", 42, format_func, use_system_role, append_user_instruction_prompt, use_service_names, personas, language, tool_response_format, static_factor=1, template_factor=1, status_request_factor=1, refusal_factor=1, failure_factor=1)
|
||||
if args.train:
|
||||
if args.size == "small":
|
||||
generate_sft_file(f"home_assistant_train{suffix}", 42, format_func, use_system_role, append_user_instruction_prompt, use_service_names, personas, language, tool_response_format, static_factor=1, template_factor=10, status_request_factor=8, refusal_factor=3, failure_factor=1)
|
||||
elif args.size == "medium":
|
||||
generate_sft_file(f"home_assistant_train{suffix}", 42, format_func, use_system_role, append_user_instruction_prompt, use_service_names, personas, language, tool_response_format, static_factor=5, template_factor=15, status_request_factor=12, refusal_factor=5, failure_factor=1)
|
||||
elif args.size == "large":
|
||||
generate_sft_file(f"home_assistant_train{suffix}", 42, format_func, use_system_role, append_user_instruction_prompt, use_service_names, personas, language, tool_response_format, static_factor=5, template_factor=20, status_request_factor=15, refusal_factor=6, failure_factor=1)
|
||||
elif args.size == "xl":
|
||||
generate_sft_file(f"home_assistant_train{suffix}", 42, format_func, use_system_role, append_user_instruction_prompt, use_service_names, personas, language, tool_response_format, static_factor=7, template_factor=25, status_request_factor=18, refusal_factor=8, failure_factor=2)
|
||||
else:
|
||||
raise Exception(f"Unrecognized dataset size: {args.size}")
|
||||
if args.test:
|
||||
generate_sft_file(f"home_assistant_test{suffix}", 12345, format_func, use_system_role, append_user_instruction_prompt, use_service_names, personas, language, tool_response_format, static_factor=0.25, template_factor=1, status_request_factor=2, refusal_factor=1, failure_factor=1)
|
||||
if len(args.language) > 1:
|
||||
if args.sample:
|
||||
merge_languages("sample", args.language)
|
||||
if args.train:
|
||||
merge_languages("home_assistant_train", args.language)
|
||||
if args.test:
|
||||
merge_languages("home_assistant_test", args.language)
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
File diff suppressed because it is too large
Load Diff
0
data/output/.gitkeep
Normal file
0
data/output/.gitkeep
Normal file
@@ -644,4 +644,118 @@ timer.meditation_clock,"Meditation duration tracker"
|
||||
timer.baby_nap_timer,"Baby nap monitor"
|
||||
timer.tea_steeping,"Tea steeping countdown"
|
||||
timer.game_timer,"Board game timer"
|
||||
timer.morning_coffee,"Morning coffee brew timer"
|
||||
timer.morning_coffee,"Morning coffee brew timer"
|
||||
light.basement_bar_cool,Basement Bar Cool Light
|
||||
light.upstairs_craft_room_zigbee,Upstairs Craft Room Light
|
||||
light.downstairs_music_room_homekit,Downstairs Music Room Light
|
||||
light.front_laundry_ge,Front Laundry Light
|
||||
light.back_exercise_warm,Back Exercise Warm Light
|
||||
light.kitchen_herb_garden_cool,Kitchen Herb Garden Cool Light
|
||||
light.upstairs_meditation_zwave,Upstairs Meditation Light
|
||||
light.downstairs_pet_area_mqtt,Downstairs Pet Area Light
|
||||
light.front_entry_closet_homekit,Front Entry Closet Light
|
||||
light.back_tool_room_lifx,Back Tool Room Light
|
||||
light.garage_paint_booth_warm,Garage Paint Booth Warm Light
|
||||
light.upstairs_craft_table_zigbee,Upstairs Craft Table Light
|
||||
light.downstairs_wine_bar_homekit,Downstairs Wine Bar Light
|
||||
light.front_potting_shed_ge,Front Potting Shed Light
|
||||
light.back_aquarium_stand_warm,Back Aquarium Stand Warm Light
|
||||
blinds.conservatory,Conservatory Blinds
|
||||
blinds.morning_room,Morning room blinds
|
||||
blinds.reading_nook,Reading nook blinds
|
||||
blinds.meditation_space,Meditation space blinds
|
||||
blinds.art_studio,Art studio blinds
|
||||
blinds.music_room,Music room blinds
|
||||
blinds.wine_cellar_window,Wine cellar window blinds
|
||||
blinds.workshop_skylight,Workshop skylight blinds
|
||||
blinds.greenhouse_south,South greenhouse blinds
|
||||
blinds.library_bay_window,Library bay window blinds
|
||||
fan.wine_cellar,Wine cellar fan
|
||||
fan.art_studio,Art studio fan
|
||||
fan.mudroom,Mudroom fan
|
||||
fan.conservatory,Conservatory fan
|
||||
fan.greenhouse,Greenhouse fan
|
||||
fan.library,Library fan
|
||||
fan.music_room,Music room fan
|
||||
fan.workshop_ceiling,Workshop ceiling fan
|
||||
fan.exercise_room,Exercise room fan
|
||||
fan.craft_room,Craft room fan
|
||||
garage_door.art_studio,Art studio door
|
||||
garage_door.pool_house,Pool house door
|
||||
garage_door.equipment_storage,Equipment storage door
|
||||
garage_door.art_gallery,Art gallery door
|
||||
garage_door.pottery_studio,Pottery studio door
|
||||
garage_door.woodshop,Woodshop door
|
||||
garage_door.auto_bay_left,Left auto bay door
|
||||
garage_door.auto_bay_right,Right auto bay door
|
||||
garage_door.detached_garage,Detached garage door
|
||||
garage_door.alley_access,Alley access door
|
||||
lock.mudroom_entry,Mudroom entry lock
|
||||
lock.solarium,Solarium Lock
|
||||
lock.servants_entrance,Servants entrance lock
|
||||
lock.breezeway,Breezeway Lock
|
||||
lock.equipment_room,Equipment room lock
|
||||
lock.art_gallery,Art Gallery Lock
|
||||
lock.trophy_room,Trophy room lock
|
||||
lock.panic_room,Panic Room Lock
|
||||
lock.server_room,Server room lock
|
||||
lock.craft_closet,Craft closet lock
|
||||
lock.hvac_room,HVAC room lock
|
||||
lock.electrical_panel,Electrical panel lock
|
||||
lock.water_heater_closet,Water heater closet lock
|
||||
lock.recycling_area,Recycling area lock
|
||||
lock.pet_door_smart,Smart pet door lock
|
||||
media_player.exercise_room,Exercise Room Media
|
||||
media_player.craft_room_radio,Craft Room Radio
|
||||
media_player.greenhouse_speaker,Greenhouse Speaker
|
||||
media_player.wine_cellar_audio,Wine Cellar Audio System
|
||||
media_player.library_audiobook,Library Audiobook Player
|
||||
media_player.meditation_room,Meditation Room Media
|
||||
media_player.art_studio_spotify,Art Studio Spotify Player
|
||||
media_player.workshop_podcast,Workshop Podcast Player
|
||||
media_player.pool_house_tv,Pool House Television
|
||||
media_player.cabana_soundbar,Cabana Soundbar
|
||||
switch.pool_heater,Pool Heater Switch
|
||||
switch.fountain_pump,Fountain Pump Switch
|
||||
switch.pond_aerator,Pond aerator switch
|
||||
switch.christmas_lights,Christmas lights switch
|
||||
switch.landscape_uplighting,Landscape uplighting control
|
||||
switch.driveway_heating,Driveway heating switch
|
||||
switch.gutter_heating,Gutter heating control
|
||||
switch.hot_tub_jets,Hot tub jets switch
|
||||
switch.sauna_heater,Sauna heater control
|
||||
switch.steam_shower,Steam shower switch
|
||||
switch.towel_warmer,Towel warmer control
|
||||
switch.wine_cooler,Wine cooler switch
|
||||
switch.aquarium_filter,Aquarium filter switch
|
||||
switch.pet_fountain,Pet fountain control
|
||||
switch.bird_bath_heater,Bird bath heater switch
|
||||
climate.wine_cellar_cooling,Wine Cellar Climate Control
|
||||
climate.greenhouse_climate,Greenhouse Climate System
|
||||
climate.server_room_cooling,Server Room Cooling
|
||||
climate.art_studio_climate,Art Studio Climate Control
|
||||
climate.humidor_control,Humidor Climate Control
|
||||
vacuum.mudroom_entry,Mudroom entry vacuum
|
||||
vacuum.workshop_floor,Workshop floor cleaner
|
||||
vacuum.craft_room_helper,Craft room cleaning bot
|
||||
vacuum.wine_cellar_vac,Wine cellar vacuum
|
||||
vacuum.greenhouse_sweeper,Greenhouse floor sweeper
|
||||
vacuum.library_quiet_mode,Library quiet vacuum
|
||||
vacuum.art_studio_cleaner,Art studio dust collector
|
||||
vacuum.exercise_equipment_area,Exercise equipment area cleaner
|
||||
vacuum.pet_feeding_station,Pet feeding station vacuum
|
||||
vacuum.laundry_room_corners,Laundry room corner cleaner
|
||||
todo.pet_care_schedule,Pet care scheduler
|
||||
todo.plant_watering_tracker,Plant watering tracker
|
||||
todo.medication_reminders,Medication reminder list
|
||||
todo.seasonal_maintenance,Seasonal maintenance checklist
|
||||
todo.gift_ideas_list,Gift ideas organizer
|
||||
todo.meal_planning,Weekly meal planner
|
||||
todo.home_inventory,Home inventory tracker
|
||||
timer.pizza_oven,Pizza oven timer
|
||||
timer.espresso_machine,Espresso machine timer
|
||||
timer.sprinkler_system,Sprinkler system timer
|
||||
timer.pool_filter,Pool filter cycle timer
|
||||
timer.dehumidifier_basement,Basement dehumidifier timer
|
||||
timer.pet_feeder,Automatic pet feeder timer
|
||||
timer.aquarium_lights,Aquarium lighting timer
|
||||
|
125
data/piles/english/pile_of_failed_tool_calls.csv
Normal file
125
data/piles/english/pile_of_failed_tool_calls.csv
Normal file
@@ -0,0 +1,125 @@
|
||||
service_name,correct_device_name,correct_friendly_name,bad_device_name,phrase,error_result,retry_prompt
|
||||
fan.increase_speed,fan.outdoor_kitchen,Outdoor kitchen fan,fan.outdoor_kitchen_pro,Could you increase the speed of the outdoor kitchen fan?,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='fan.outdoor_kitchen_pro', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Sure, I’ll try the Outdoor kitchen fan instead."
|
||||
blinds.open_cover,blinds.theater_room,Home theater blinds,blinds.theatre_room,"Open the Home theater blinds, please.","<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='blinds.theatre_room', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Got it, I'll try again with the correct device."
|
||||
climate.turn_on,climate.carrier_cor,Carrier Cor Wi-Fi Thermostat,climate.carrier_cor_main,"Hey, could you turn on the thermostat?","<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='climate.carrier_cor_main', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Sure, I'll try again with the Carrier Cor thermostat."
|
||||
vacuum.return_to_base,vacuum.greenhouse_sweeper,Greenhouse floor sweeper,vacuum.greenhouse_sweeper_pro,Please send the Greenhouse floor sweeper back to its base.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='vacuum.greenhouse_sweeper_pro', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Got it, I'll use the correct vacuum now."
|
||||
climate.turn_on,climate.greenhouse_climate,Greenhouse Climate System,climate.greenhouse_climatet,Please turn on the greenhouse climate system.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='climate.greenhouse_climatet', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Got it, trying again with the correct device."
|
||||
media_player.volume_down,media_player.pool_house_tv,Pool House Television,media_player.pool_house_tv_main,Could you lower the volume on the Pool House TV?,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='media_player.pool_house_tv_main', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Got it, I'll try the Pool House Television."
|
||||
vacuum.return_to_base,vacuum.patio_doorway_vac,Patio doorway cleaner,vacuum.patio_doorway_cleaner,Could you send the patio doorway cleaner back to its charging base?,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='vacuum.patio_doorway_cleaner', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Alright, I'll try with the correct device."
|
||||
garage_door.open_cover,garage_door.motorcycle,Motorcycle Garage,garage_door.cyclemotor,Open the garage door cover for the motorcycle garage.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='garage_door.cyclemotor', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Sure, I'll try the Motorcycle Garage instead."
|
||||
garage_door.toggle,garage_door.woodshop,Woodshop door,garage_door.woodshop_main,Could you toggle the Woodshop door?,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='garage_door.woodshop_main', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Got it, trying the Woodshop door."
|
||||
lock.unlock,lock.gym,Home Gym Lock,lock.gymnasium,"Unlock the home gym lock, please.","<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='lock.gymnasium', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Okay, let me try the Home Gym Lock."
|
||||
light.turn_on,light.kitchen_island_cool,Kitchen Island Cool Light,light.kitchen_island_cooler,Turn on the kitchen island cool light.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='light.kitchen_island_cooler', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Okay, I'll try the Kitchen Island Cool Light."
|
||||
light.toggle,light.front_basement_homekit,Front Basement Light,light.front_basement_homekit_backup,Could you toggle the front basement light?,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='light.front_basement_homekit_backup', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Sure, I'll try the Front Basement Light."
|
||||
climate.turn_off,climate.emerson_sensi_touch,Emerson Sensi Touch Wi-Fi Thermostat,climate.emerson_sensi,Please turn off the thermostat.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='climate.emerson_sensi', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Sure, I’ll try again with the Emerson Sensi Touch thermostat."
|
||||
vacuum.return_to_base,vacuum.basement_deebot,Basement deebot,vacuum.basement_deebot_v2,Please return the vacuum to its base.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='vacuum.basement_deebot_v2', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Sure, I'll try with the Basement Deebot."
|
||||
light.toggle,light.front_entryway_homekit,Front Entryway Light,light.front_entryway_homekit_v2,Could you toggle the front entryway light?,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='light.front_entryway_homekit_v2', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Okay, let me try the Front Entryway Light."
|
||||
lock.unlock,lock.secure_storage,Secure storage lock,lock.secure_storag,Could you unlock the secure storage for me?,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='lock.secure_storag', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Sure, I'll try unlocking the Secure storage lock."
|
||||
fan.turn_off,fan.living_room_center,Center living room fan,fan.living_center_room,Please turn off the living room fan.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='fan.living_center_room', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Okay, turning off the Center living room fan."
|
||||
media_player.volume_down,media_player.workshop_podcast,Workshop Podcast Player,media_player.workshop_podcas,Could you turn the volume down on the Workshop Podcast Player?,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='media_player.workshop_podcas', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Okay, I'll try that on the correct player."
|
||||
light.turn_off,light.garden_2,Garden Light,light.garden_2s,Please turn off the garden light.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='light.garden_2s', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Sure, turning off the Garden Light now."
|
||||
vacuum.return_to_base,vacuum.pet_feeding_station,Pet feeding station vacuum,vacuum.pet_feeder_station,"Hey assistant, could you send the vacuum back to its base?","<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='vacuum.pet_feeder_station', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Sure, I'll try with the Pet feeding station vacuum."
|
||||
garage_door.open_cover,garage_door.carport,Carport door,garage_door.carpor,"Could you open the carport door, please?","<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='garage_door.carpor', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Sure, I'll try that again with the right device."
|
||||
garage_door.stop_cover,garage_door.two_car,Two Car Garage,garage_door.twon_car,"Hey, could you stop the garage door?","<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='garage_door.twon_car', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Got it, let me try that again with the correct garage door."
|
||||
switch.toggle,switch.wine_cooler,Wine cooler switch,switch.wine_cooler_main,Could you turn off the wine cooler switch?,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='switch.wine_cooler_main', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Got it, I'll try the Wine cooler switch instead."
|
||||
blinds.stop_cover,blinds.wine_cellar_window,Wine cellar window blinds,blinds.wine_cellar_window_cover,Please stop the wine cellar window blinds.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='blinds.wine_cellar_window_cover', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Sure, I’ll try that again with the correct device."
|
||||
garage_door.toggle,garage_door.auto_bay_left,Left auto bay door,garage_door.auto_bay_lft,Could you please toggle the garage door for me?,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='garage_door.auto_bay_lft', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Got it, I'll try the correct left auto bay door now."
|
||||
media_player.turn_on,media_player.apple_tv_4k,Apple 4K Streaming Device,media_player.apple_tv_4,Turn on the Apple 4K Streaming Device.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='media_player.apple_tv_4', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Sure, I'll turn on the Apple 4K Streaming Device."
|
||||
light.toggle,light.master_bedroom_2,Master Bedroom Lights,light.master_bedroom_2s,Could you toggle the Master Bedroom Lights?,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='light.master_bedroom_2s', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Got it, trying the correct Master Bedroom Lights now."
|
||||
switch.turn_off,switch.kitchen_lights,Kitchen Lights Switch,switch.kitchen_light_main,"Could you turn off the kitchen lights, please?","<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='switch.kitchen_light_main', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Sure, I'll turn off the Kitchen Lights Switch."
|
||||
fan.turn_on,fan.front_porch,Front Porch Fan,fan.fron_porch,Can you turn on the front porch fan?,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='fan.fron_porch', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Sure, I’ll try turning on the Front Porch Fan."
|
||||
switch.turn_on,switch.front_gate_lighting,Front gate lights switch,switch.front_gate_light,"Could you turn on the front gate lights, please?","<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='switch.front_gate_light', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Sure, I'll use the Front gate lights switch instead."
|
||||
fan.toggle,fan.laundry_room,Laundry room fan,fan.laundry_rm,Turn on the laundry room fan.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='fan.laundry_rm', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Got it, trying the Laundry room fan."
|
||||
media_player.media_play_pause,media_player.sonos_arc,Sonos Smart Soundbar,media_player.sonos_acr,"Hey Assistant, pause the music on the soundbar.","<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='media_player.sonos_acr', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Sure thing, using the Sonos Smart Soundbar now."
|
||||
garage_door.open_cover,garage_door.carport,Carport door,garage_door.carport_switch,Open the carport door,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='garage_door.carport_switch', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Alright, let me try the Carport door instead."
|
||||
light.turn_on,light.kitchen_cabinet_warm,Kitchen Cabinet Warm Light,light.kitchen_warm_cabinet,Turn on the kitchen cabinet warm light to 53 percent brightness in blue.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='light.kitchen_warm_cabinet', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Got it, let me try the Kitchen Cabinet Warm Light."
|
||||
garage_door.stop_cover,garage_door.art_gallery,Art gallery door,garage_door.art_gallery_main,"Stop the garage door, please.","<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='garage_door.art_gallery_main', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Sure, I’ll try again with the Art gallery door."
|
||||
light.turn_off,light.above_dining_table,Dining Table Light,light.above_diningtbl,Could you turn off the dining table light?,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='light.above_diningtbl', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Okay, trying the Dining Table Light now."
|
||||
fan.turn_on,fan.balcony,Balcony Fan,fan.balc,"Turn on the balcony fan, please.","<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='fan.balc', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Okay, I'll try turning on the Balcony Fan."
|
||||
vacuum.stop,vacuum.living_room_roomba,Living room vacuum,vacuum.living_room_roomba_v2,Could you stop the living room vacuum?,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='vacuum.living_room_roomba_v2', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Okay, I’ll try that again with the Living room vacuum."
|
||||
lock.lock,lock.pool_gate,Swimming pool gate,lock.poolgate,Please lock the swimming pool gate.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='lock.poolgate', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Sure, I'll try the correct device now."
|
||||
switch.toggle,switch.driveway_heating,Driveway heating switch,switch.heating_driveway,"Turn on the driveway heating, please.","<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='switch.heating_driveway', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Got it, I'll try the driveway heating switch."
|
||||
fan.turn_off,fan.attic_3,Attic Fans,fan.attic_3b,Please turn off the attic fans.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='fan.attic_3b', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Okay, I’ll try again with the correct device."
|
||||
vacuum.stop,vacuum.laundry_room_corners,Laundry room corner cleaner,vacuum.laundry_room_cornrs,Please stop the vacuum in the laundry room corners.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='vacuum.laundry_room_cornrs', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Okay, I'll stop the Laundry room corner cleaner."
|
||||
fan.decrease_speed,fan.study_2,Study fan,fan.study_2x,Can you decrease the speed of the study fan?,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='fan.study_2x', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Got it, I’ll adjust the speed of the Study fan."
|
||||
blinds.open_cover,blinds.library_bay_window,Library bay window blinds,blinds.librarybay_window,Please open the library bay window blinds.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='blinds.librarybay_window', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Okay, I'll try that again with the correct device."
|
||||
switch.toggle,switch.pet_fountain,Pet fountain control,switch.pet_fount,"Hey assistant, turn off the pet fountain.","<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='switch.pet_fount', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Alright, trying the correct Pet fountain control."
|
||||
fan.turn_off,fan.basement,Basement Fan,fan.base,Could you turn off the basement fan?,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='fan.base', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Sure, turning off the Basement Fan now."
|
||||
lock.unlock,lock.garden_gate,Garden gate lock,lock.garden_gate_main,Could you unlock the garden gate lock?,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='lock.garden_gate_main', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Sure, I’ll try unlocking the Garden gate lock."
|
||||
blinds.toggle,blinds.hallway,Hallway Blinds,blinds.hallway_main,Could you toggle the hallway blinds for me?,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='blinds.hallway_main', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Sure, I'll try that again with the Hallway Blinds."
|
||||
garage_door.stop_cover,garage_door.golf_cart,Golf cart door,garage_door.golf_cart_v2,"Hey assistant, stop the garage door for the golf cart.","<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='garage_door.golf_cart_v2', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Got it, trying again with the Golf cart door."
|
||||
media_player.volume_down,media_player.wall_mounted_tv_bedroom,Bedroom Wall-Mounted TV,media_player.wall_mounted_tv_bedr,Could you turn the volume down on the bedroom wall‑mounted TV?,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='media_player.wall_mounted_tv_bedr', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Got it, let me try that on the correct bedroom TV."
|
||||
lock.lock,lock.file_cabinet,File cabinet lock,lock.file_cabinet_main,Please lock the file cabinet.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='lock.file_cabinet_main', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Sure, I'll try that again with the correct lock."
|
||||
switch.turn_on,switch.dining_room_lights,Dining Room Lights Switch,switch.dining_room_lights_main,Could you turn on the dining room lights?,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='switch.dining_room_lights_main', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Okay, let me try the correct Dining Room Lights Switch."
|
||||
lock.unlock,lock.yale_kitchen,Yale Kitchen,lock.yale_kitch,"Hey, could you unlock the kitchen lock?","<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='lock.yale_kitch', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Got it, trying again with Yale Kitchen."
|
||||
climate.turn_off,climate.art_studio_climate,Art Studio Climate Control,climate.artstudio_climat,"Hey, could you turn off the climate in the art studio?","<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='climate.artstudio_climat', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Sure, I’ll use the correct Art Studio Climate Control."
|
||||
blinds.open_cover,blinds.morning_room,Morning room blinds,blinds.morning_room_backup,"Hey, could you open the cover of the morning room blinds?","<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='blinds.morning_room_backup', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Sure, trying again with the Morning room blinds."
|
||||
fan.decrease_speed,fan.living_room_2,Living Room fan,fan.livingroom_2,Could you lower the speed of the living room fan?,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='fan.livingroom_2', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Sure, decreasing the speed of the Living Room fan."
|
||||
garage_door.stop_cover,garage_door.equipment_storage,Equipment storage door,garage_door.storage_equipment,Can you stop the equipment storage garage door?,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='garage_door.storage_equipment', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Sure, trying the Equipment storage door now."
|
||||
garage_door.stop_cover,garage_door.liftmaster_2,LiftMaster,garage_door.liftmaster_2_backup,"Could you stop the garage door, please?","<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='garage_door.liftmaster_2_backup', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Okay, I'll try that again with LiftMaster."
|
||||
fan.turn_on,fan.study_1,Study fan,fan.studyy_1,Could you turn on the study fan?,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='fan.studyy_1', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Got it, I'll try the Study fan instead."
|
||||
climate.turn_on,climate.art_studio_climate,Art Studio Climate Control,climate.artstudio_climate,"Hey assistant, turn on the climate in the art studio.","<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='climate.artstudio_climate', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Sure, turning on the Art Studio Climate Control."
|
||||
climate.turn_off,climate.trane_comfortlink_ii,Trane ComfortLink II XL1050,climate.trane_comfortlink_ii_backup,"Hey assistant, could you turn off the climate?","<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='climate.trane_comfortlink_ii_backup', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Got it, trying again with the correct device."
|
||||
fan.turn_off,fan.ceiling_2,Ceiling Fans,fan.ceiling_two,"Turn off the ceiling fans, please.","<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='fan.ceiling_two', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Sure, I'll turn off the ceiling fans now."
|
||||
blinds.stop_cover,blinds.wine_cellar_window,Wine cellar window blinds,blinds.wine_cellar_wind,Stop the blinds on the wine cellar window.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='blinds.wine_cellar_wind', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Got it, trying again with the wine cellar window blinds."
|
||||
fan.toggle,fan.kitchen,Kitchen Fan,fan.kitchen_main,Turn on the kitchen fan.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='fan.kitchen_main', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Sure, trying the Kitchen Fan now."
|
||||
fan.increase_speed,fan.dining_room,Dining Room Fan,fan.dine_room,Increase the speed of the fan in the dining room.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='fan.dine_room', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Okay, adjusting the speed of the Dining Room Fan."
|
||||
blinds.toggle,blinds.wine_cellar_window,Wine cellar window blinds,blinds.wine_cellar_wind,Please lower the wine cellar window blinds.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='blinds.wine_cellar_wind', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Got it, trying again with the correct blinds.wine_cellar_window."
|
||||
fan.increase_speed,fan.garage_workshop,Garage workshop fan,fan.garage_workshop_main,Could you increase the speed of the garage workshop fan?,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='fan.garage_workshop_main', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Sure, let me try that on the garage workshop fan."
|
||||
vacuum.start,vacuum.dining_area_bissel,Dining area dirt remover,vacuum.bissel_dining_area,Could you start the vacuum in the dining area?,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='vacuum.bissel_dining_area', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Sure, I'll start the Dining area dirt remover instead."
|
||||
media_player.turn_off,media_player.nintendo_switch,Nintendo Switch,media_player.nintendo_switched,Could you please turn off the Nintendo Switch?,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='media_player.nintendo_switched', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Sure, I'll try turning off the Nintendo Switch."
|
||||
fan.turn_off,fan.outdoor_kitchen,Outdoor kitchen fan,fan.kitchen_outdoor,Turn off the outdoor kitchen fan.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='fan.kitchen_outdoor', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Sure, I'll try the Outdoor kitchen fan now."
|
||||
light.turn_off,light.downstairs_bathroom_warm,Downstairs Bathroom Warm Light,light.bathroom_warm_downstairs,Could you turn off the downstairs bathroom warm light?,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='light.bathroom_warm_downstairs', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Okay, I’ll switch off the Downstairs Bathroom Warm Light for you."
|
||||
garage_door.open_cover,garage_door.guest,Guest Garage Door,garage_door.gues,Open the guest garage door.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='garage_door.gues', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Sure, I’ll open the Guest Garage Door for you."
|
||||
garage_door.open_cover,garage_door.upper_level,Upper Level Garage,garage_door.upper_lvl,"Hey, could you open the garage door cover on the upper level?","<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='garage_door.upper_lvl', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Got it, let me try with the Upper Level Garage."
|
||||
fan.turn_off,fan.mudroom,Mudroom fan,fan.mudroom_extra,Could you turn off the mudroom fan?,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='fan.mudroom_extra', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Sure, turning off the Mudroom fan now."
|
||||
media_player.volume_up,media_player.xbox_den,Den Xbox console,media_player.den_xbox,"Hey, could you increase the volume on the Xbox in the den?","<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='media_player.den_xbox', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Sure, adjusting the volume on the Den Xbox console."
|
||||
blinds.stop_cover,blinds.skylight,Skylight Blinds,blinds.skylite,Stop the skylight blinds.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='blinds.skylite', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Sure, I'll try that again with the Skylight Blinds."
|
||||
fan.decrease_speed,fan.attic_2,Attic Fans,fan.attic2,Could you lower the speed of the attic fans?,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='fan.attic2', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Sure, adjusting the speed on Attic Fans."
|
||||
light.toggle,light.back_nursery_warm,Back Nursery Warm Light,light.back_nurserywarm,Could you toggle the back nursery warm light?,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='light.back_nurserywarm', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Okay, I'll try the correct Back Nursery Warm Light."
|
||||
vacuum.stop,vacuum.master_bedroom_shark,Master bedroom vacuum,vacuum.master_shark_bedroom,"Hey, could you stop the vacuum in the master bedroom?","<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='vacuum.master_shark_bedroom', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Got it, I'll stop the Master bedroom vacuum now."
|
||||
switch.toggle,switch.pantry_lights,Pantry Lights Switch,switch.pantry_lights_switch,Could you turn off the pantry lights?,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='switch.pantry_lights_switch', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Okay, let me try the correct pantry lights switch."
|
||||
switch.turn_on,switch.dining_room_lights,Dining Room Lights Switch,switch.dining_room_lgihts,"Turn on the dining room lights, please.","<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='switch.dining_room_lgihts', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","No problem, I’ll use the Dining Room Lights Switch instead."
|
||||
garage_door.stop_cover,garage_door.boat,Boat Garage Door,garage_door.boat_gate,Please stop the garage door.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='garage_door.boat_gate', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Got it, I'll try again with the Boat Garage Door."
|
||||
light.turn_on,light.front_laundry_ge,Front Laundry Light,light.front_laundry_gear,Turn on the front laundry light to cool white.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='light.front_laundry_gear', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Got it, trying the Front Laundry Light now."
|
||||
switch.turn_on,switch.pool_area_lighting,Pool area lighting control,switch.pool_area_lights_ctrl,Please turn on the pool area lighting.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='switch.pool_area_lights_ctrl', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Sure, I’ll try the Pool area lighting control now."
|
||||
garage_door.stop_cover,garage_door.left_door,Left Garage Door,garage_door.leftdoor,Please stop the left garage door.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='garage_door.leftdoor', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Got it, trying again with the left garage door."
|
||||
lock.unlock,lock.den,Den Lock,lock.din,Can you unlock the den lock?,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='lock.din', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Sure, I'll try unlocking the Den Lock."
|
||||
media_player.turn_on,media_player.bose_home_speaker,Bose Wireless Speaker,media_player.bose_home_sound,Could you turn on the Bose Wireless Speaker?,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='media_player.bose_home_sound', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Sure, I'll try turning on the Bose Wireless Speaker."
|
||||
switch.toggle,switch.sauna_heater,Sauna heater control,switch.sauna_heater_ctrl,"Could you toggle the sauna heater, please?","<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='switch.sauna_heater_ctrl', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Sure, I'll use the correct Sauna heater control."
|
||||
vacuum.stop,vacuum.mudroom_entry,Mudroom entry vacuum,vacuum.entry_mudroom,Could you please stop the vacuum in the mudroom entry?,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='vacuum.entry_mudroom', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Sure, I’ll try again with the Mudroom entry vacuum."
|
||||
switch.toggle,switch.terrace_lighting,Terrace lighting control,switch.terrace_lighting_backup,Could you turn off the terrace lighting?,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='switch.terrace_lighting_backup', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Got it, I'll use the correct Terrace lighting control."
|
||||
lock.lock,lock.solarium,Solarium Lock,lock.solarium_main,Could you lock the Solarium for me?,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='lock.solarium_main', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Sure, I'll try the Solarium Lock now."
|
||||
media_player.volume_down,media_player.roku_bedroom,Roku Master Bedroom,media_player.roku_master_bedroom,Could you turn the volume down on Roku Master Bedroom?,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='media_player.roku_master_bedroom', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Sure, adjusting the volume on Roku Master Bedroom."
|
||||
media_player.turn_on,media_player.apple_tv_4k,Apple 4K Streaming Device,media_player.apple_tv_4k_livingroom,Could you turn on the Apple 4K Streaming Device?,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='media_player.apple_tv_4k_livingroom', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Okay, trying again with the Apple 4K Streaming Device."
|
||||
lock.unlock,lock.tool_shed,Tool Shed Lock,lock.shed_tool,Could you unlock the tool shed lock for me?,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='lock.shed_tool', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Sure, I'll try the correct device (lock.tool_shed) now."
|
||||
media_player.media_play_pause,media_player.playstation_5,Sony PS5,media_player.play_station_5,Can you pause the media on my Sony PS5?,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='media_player.play_station_5', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Sure, I'll try that on Sony PS5."
|
||||
media_player.turn_off,media_player.roku_living,Roku Living Room,media_player.roku_livingroom,Turn off the Roku in the living room.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='media_player.roku_livingroom', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Okay, I'll turn off Roku Living Room instead."
|
||||
vacuum.start,vacuum.living_room_roomba,Living room vacuum,vacuum.living_room_roombax,"Start the living room vacuum, please.","<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='vacuum.living_room_roombax', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Sure, I'll start the Living room vacuum for you."
|
||||
climate.turn_off,climate.zen_wifi_thermostat,Zen Thermostat WiFi Edition,climate.zen_wifith_thermostat,Could you turn off the Zen Thermostat WiFi Edition?,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='climate.zen_wifith_thermostat', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Sure, I’ll turn off the thermostat now."
|
||||
garage_door.toggle,garage_door.main,Main Garage Door,garage_door.main_gate,Could you toggle the garage door?,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='garage_door.main_gate', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Sure, I'll try that with the Main Garage Door."
|
||||
blinds.stop_cover,blinds.patio,Patio Blinds,blinds.patio_cover,"Hey, stop the patio blinds.","<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='blinds.patio_cover', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Sure, I'll try again with the Patio Blinds."
|
||||
light.toggle,light.upstairs_basement_zwave,Upstairs Basement Light,light.upstairs_basement_zwave_extra,Turn on the upstairs basement light.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='light.upstairs_basement_zwave_extra', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Okay, let me try the Upstairs Basement Light."
|
||||
blinds.close_cover,blinds.bathroom,Bathroom Blinds,blinds.bathroam,"Close the bathroom blinds, please.","<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='blinds.bathroam', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Sure, I'll try that again with the bathroom blinds."
|
||||
media_player.turn_on,media_player.xbox_one,Xbox One,media_player.xobx_one,Can you turn on the Xbox One?,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='media_player.xobx_one', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Sure thing, I'll try turning on the Xbox One now."
|
||||
lock.lock,lock.office,Office Lock,office.lock,Could you lock the office door for me?,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='office.lock', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Sure, I'll lock the Office Lock instead."
|
||||
climate.turn_on,climate.humidor_control,Humidor Climate Control,climate.humidor_ctrl,Turn on the humidor climate control.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='climate.humidor_ctrl', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Sure, I’ll use the Humidor Climate Control instead."
|
||||
garage_door.close_cover,garage_door.liftmaster_2,LiftMaster,garage_door.liftmaster_2_backup,"Close the garage door, please.","<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='garage_door.liftmaster_2_backup', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Got it, I'll try again with the LiftMaster garage door."
|
||||
light.turn_on,light.front_office_mqtt,Front Office Light,light.front_offic_mqtt,Can you turn on the front office light?,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='light.front_offic_mqtt', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Sure thing, I'll try the Front Office Light now."
|
||||
switch.turn_on,switch.utility_room_lights,Utility Room Lights Switch,switch.utilityroom_lights,"Turn on the utility room lights, please.","<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='switch.utilityroom_lights', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Okay, I’ll try again with the Utility Room Lights Switch."
|
||||
blinds.open_cover,blinds.conservatory,Conservatory Blinds,blinds_conservatory,"Could you open the conservatory blinds, please?","<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='blinds_conservatory', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Got it, I'll try again with the Conservatory Blinds."
|
||||
switch.turn_off,switch.outdoor_security_lights,Outdoor Security Lights Switch,switch.outdoor_security_lights_main,Please turn off the outdoor security lights.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='switch.outdoor_security_lights_main', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Got it, I'll try turning off the outdoor security lights."
|
||||
climate.turn_on,climate.tado_smart,Tado Smart Thermostat,climate.tado_smartplus,"Could you turn on the climate, please?","<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='climate.tado_smartplus', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Sure, I'll try again with the Tado Smart Thermostat."
|
||||
lock.unlock,lock.fence_gate,Fence gate lock,lock.fenc_gate,"Could you unlock the fence gate, please?","<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='lock.fenc_gate', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Sure, I’ll try again with the correct lock."
|
||||
light.turn_off,light.basement_bar_cool,Basement Bar Cool Light,light.basement_bar_cooler,Could you turn off the basement bar cool light?,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='light.basement_bar_cooler', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Okay, I'll switch off the Basement Bar Cool Light."
|
||||
lock.lock,lock.office,Office Lock,lock.offic,Please lock the office door.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='lock.offic', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Sure, I'll try again with the Office Lock."
|
||||
blinds.toggle,blinds.living_room_large,Main living room blinds,blinds.living_rm_large,Could you toggle the main living room blinds?,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='blinds.living_rm_large', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Sure, I’ll try again with the correct device."
|
||||
vacuum.start,vacuum.front_hall_samsung,Front hall sweeping bot,vacuum.front_hall_samsunx,"Start the vacuum in the front hall, please.","<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='vacuum.front_hall_samsunx', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Okay, I’ll try the Front hall sweeping bot."
|
||||
climate.set_temperature,climate.trane_comfortlink_ii,Trane ComfortLink II XL1050,climate.trane_comfortlink_iix,Set the thermostat to <temp_f> degrees.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='climate.trane_comfortlink_iix', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Okay, I'll try the Trane ComfortLink II now."
|
||||
vacuum.return_to_base,vacuum.greenhouse_sweeper,Greenhouse floor sweeper,vacuum.greenhouse_sweeper_pro,"Could you send the vacuum back to its base, please?","<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='vacuum.greenhouse_sweeper_pro', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Sure, I'll try that again with the correct device."
|
||||
media_player.turn_on,media_player.harman_kardon_aura,Harman Kardon Glass Speaker,media_player.harmonkardon_aura,"Turn on the Harman Kardon Glass Speaker, please.","<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='media_player.harmonkardon_aura', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Sure, I'll try turning on the Harman Kardon Glass Speaker."
|
||||
fan.turn_on,fan.shed,Shed fan,fan.shedroom,Can you turn on the shed fan?,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='fan.shedroom', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","No problem, I’ll try again with the Shed fan."
|
||||
vacuum.stop,vacuum.art_studio_cleaner,Art studio dust collector,vacuum.artstudio_cleaner,Could you stop the vacuum in the art studio?,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='vacuum.artstudio_cleaner', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Sure, I'll stop the Art studio dust collector."
|
||||
light.turn_off,light.master_bedroom_lamp,Master Bedroom Lamp,light.master_bedroom_lamp_ctrl,Could you turn off the master bedroom lamp?,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='light.master_bedroom_lamp_ctrl', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Sure, I'll try again with the Master Bedroom Lamp."
|
||||
climate.turn_off,climate.humidor_control,Humidor Climate Control,climate.humidor_ctrl,Please turn off the humidor climate control.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='climate.humidor_ctrl', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Okay, trying again with the Humidor Climate Control."
|
||||
vacuum.return_to_base,vacuum.workshop_floor,Workshop floor cleaner,vacuum.workshop_floors,Could you send the workshop floor cleaner back to its base?,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='vacuum.workshop_floors', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Got it, sending the Workshop floor cleaner back to its base."
|
||||
|
124
data/piles/english/pile_of_refusals.csv
Normal file
124
data/piles/english/pile_of_refusals.csv
Normal file
@@ -0,0 +1,124 @@
|
||||
reason_type,service_name,device_name,friendly_name,desired_state,phrase,response
|
||||
not_available,lock.lock,back_door,Back Door Lock,,"Lock the <device_name>.","I can't find a back door lock to control."
|
||||
already_state,light.turn_on,hallway,Hallway Lights,on,"Turn on the <device_name>.","The hallway lights are already on."
|
||||
already_state,switch.turn_off,garage,Garage Outlet,off,"Turn off the <device_name>.","The garage outlet is already off."
|
||||
not_available,blinds.close_cover,sunroom,Sunroom Blinds,,Close the <device_name> blinds,"I’m sorry, but I can’t locate that device in your home."
|
||||
not_available,light.turn_on,downstairs_livingroom_lifx,Downstairs Living Room Light,,turn on the <device_name> with color blue,"I’m sorry, I can’t locate that device in your home."
|
||||
already_state,media_player.media_play_pause,sonos_beam,Sonos Compact Soundbar,playing,Pause <device_name>,"It's already playing, so there's nothing to change."
|
||||
not_available,media_player.volume_up,playstation_5,Sony PS5,,Increase the volume of <device_name>,"I’m sorry, I can’t locate <device_name> in your home."
|
||||
not_available,fan.turn_on,bathroom,Bathroom Fan,,Turn on the <device_name>.,"I’m sorry, I can’t locate that device in your home."
|
||||
not_available,light.toggle,garden,Garden Light,,Toggle <device_name>,"Sorry, I can't locate that device in your home."
|
||||
not_available,media_player.volume_up,roku_living,Roku Living Room,,Turn up the volume on <device_name>,"I’m sorry, I can’t find <device_name> in your home, so I can’t adjust its volume."
|
||||
not_available,garage_door.open_cover,side_2,Side garage door,,Open the <device_name>.,"I’m sorry, but I can’t locate a <device_name> in your home to open."
|
||||
already_state,light.turn_off,front_tv_room_ge,Front TV Room Light,off,Turn off the <device_name>,"The <device_name> is already off, so there's nothing to change."
|
||||
not_available,garage_door.stop_cover,golf_cart,Golf Cart Garage,,Stop the <device_name>,"I’m sorry, I can’t find that device in your home."
|
||||
not_available,lock.lock,playroom,Playroom Lock,,Lock the <device_name>,"I’m sorry, I can’t find that lock in your home."
|
||||
not_available,fan.decrease_speed,kitchen_island,Cooling kitchen fan,,Decrease the speed of the <device_name>,"Sorry, I couldn't locate that fan in your home."
|
||||
already_state,switch.turn_off,pantry_lights,Pantry Lights Switch,off,Turn off the <device_name>.,"Sorry, the <device_name> is already off, so there's nothing to change."
|
||||
not_available,vacuum.stop,dining_area_bissel,Dining area dirt remover,,stop the <device_name>,"I’m sorry, I can’t locate that device in your home."
|
||||
not_available,fan.turn_on,dyson_pure,Dyson Pure Fan,,Turn on the <device_name>.,"I’m sorry, I can’t locate a <device_name> in your home."
|
||||
already_state,climate.turn_off,trane_comfortlink_ii,Trane ComfortLink II XL1050,off,Turn off the <device_name>,"Sorry, the <device_name> is already off, so there's nothing to change."
|
||||
not_available,garage_door.open_cover,boat,Boat storage door,,Open the <device_name> cover,"I’m sorry, I can’t locate that device in your home."
|
||||
already_state,light.turn_off,office_1,Office Light,off,Turn off the <device_name>,"The <device_name> is already off, so there's nothing to change."
|
||||
already_state,lock.unlock,secure_storage,Secure storage lock,unlocked,Unlock the <device_name>,"Sorry, the <device_name> is already unlocked, so there's nothing to do."
|
||||
not_available,fan.turn_on,office,Office Fan,,Turn on the <device_name>,"I’m sorry, I can’t locate a <device_name> in your home."
|
||||
not_available,light.turn_on,patio,Patio Light,,turn on the <device_name>,"I’m sorry, but I can’t locate that device in your home."
|
||||
not_available,switch.toggle,fountain_pump,Fountain Pump Switch,,Toggle the <device_name>,"I’m sorry, but I can’t locate that device in your home."
|
||||
not_available,climate.set_temperature,ecobee_smart,Ecobee SmartThermostat,,Set the temperature of <device_name> to 25 degrees.,"I’m sorry, but I can’t locate that device in your home."
|
||||
not_available,garage_door.open_cover,basement,Basement Garage Door,,Open the <device_name> cover,"I'm sorry, but I can't find that device in your home."
|
||||
not_available,switch.toggle,pond_aerator,Pond aerator switch,,Toggle the <device_name>,"I’m sorry, I can’t locate the <device_name> in your home."
|
||||
not_available,climate.turn_off,humidor_control,Humidor Climate Control,,Turn off the <device_name>.,"I’m sorry, but I can’t locate that device in your home."
|
||||
already_state,media_player.media_play_pause,home_theater_system_living_room,Living Room Home Theater,playing,Pause <device_name>,"Sorry, <device_name> is already playing, so no change is needed."
|
||||
not_available,blinds.close_cover,kids_room,Kids' room blinds,,Close the <device_name> blinds,"I’m sorry, but I can’t locate that device in your home."
|
||||
not_available,vacuum.start,smart_home_automator,Smart home cleaning bot,,Start the <device_name>.,"I’m sorry, but I can’t find that device in your home."
|
||||
not_available,media_player.volume_up,backyard_outdoor_projector,Backyard Projector,,Increase the volume of <device_name>,"I’m sorry, I can’t locate <device_name> in your home."
|
||||
not_available,lock.lock,garage,Garage Door Lock,,Lock the <device_name>.,"I’m sorry, but I can’t find that device in your home."
|
||||
not_available,climate.turn_on,emerson_sensi_touch,Emerson Sensi Touch Wi-Fi Thermostat,,turn on the <device_name>,"I’m sorry, I can’t locate that device in your home."
|
||||
not_available,fan.toggle,patio,Patio Fan,,Toggle the <device_name>,"I’m sorry, I can’t locate that fan in your home."
|
||||
not_available,vacuum.return_to_base,downstairs_guest_room,Downstairs guest room vac,,Return <device_name> to its base,"I’m sorry, but I can’t locate that device in the home right now."
|
||||
not_available,fan.toggle,kids_room,Kids' room fan,,Toggle the <device_name>,"I’m sorry, I can’t locate that device in your home."
|
||||
not_available,climate.set_temperature,ecobee_smart,Ecobee SmartThermostat,,Set the temperature of <device_name> to 20 degrees.,"I’m sorry, I can’t locate <device_name> in your home, so I’m unable to set the temperature."
|
||||
already_state,blinds.close_cover,conservatory,Conservatory Blinds,closed,Close the <device_name> blinds,"The <device_name> is already closed, so there's nothing to change."
|
||||
already_state,media_player.turn_off,epson_home_cinema,Epson Video Projector,off,Turn off <device_name>,"Sorry, <device_name> is already off, so there's nothing to do."
|
||||
not_available,fan.turn_on,office,Office Fan,,Turn on the <device_name>.,"I’m sorry, I can’t locate that device in your home."
|
||||
not_available,vacuum.start,wine_cellar_vac,Wine cellar vacuum,,Start the <device_name>,"I’m sorry, I can’t locate that device in your home."
|
||||
not_available,switch.toggle,sunroom_lights,Sunroom Lights Switch,,Toggle the <device_name>,"I’m sorry, I can’t locate that device in your home."
|
||||
not_available,vacuum.stop,workshop_floor,Workshop floor cleaner,,"Hey assistant, please stop the <device_name>.","I’m sorry, but I can’t locate that device in your home."
|
||||
not_available,garage_door.toggle,chamberlain_2,Chamberlain,,Toggle the <device_name>.,"I’m sorry, I can’t locate a <device_name> in your home to toggle."
|
||||
not_available,climate.turn_on,kono_thermostat,Kono Smart Thermostat,,Turn on the <device_name> climate,"I’m sorry, I can’t locate a <device_name> in your home."
|
||||
not_available,climate.set_temperature,greenhouse_climate,Greenhouse Climate System,,Set the temperature of <device_name> to 26 degrees,"I’m sorry, I can’t locate that device in your home."
|
||||
not_available,vacuum.return_to_base,back_deck_sweeper,Back deck area cleaner,,Return <device_name> to its base,"I’m sorry, but I can’t find that device in the home right now."
|
||||
not_available,climate.set_temperature,humidor_control,Humidor Climate Control,,Set the temperature of <device_name> to 18 degrees,"I'm sorry, I can't locate <device_name> in your home."
|
||||
not_available,garage_door.stop_cover,golf_cart,Golf cart door,,stop the <device_name>,"I’m sorry, I can’t locate that device in your home."
|
||||
not_available,blinds.toggle,morning_room,Morning room blinds,,Toggle the <device_name> blinds,"I’m sorry, but I can’t locate that blind in your home."
|
||||
already_state,fan.turn_off,outdoor_kitchen,Outdoor kitchen fan,off,Turn off the <device_name>,"Sorry, the <device_name> is already off, so there's nothing to change."
|
||||
not_available,fan.increase_speed,laundry_room,Laundry room fan,,Increase the speed of the <device_name>.,"I’m sorry, I can’t locate that fan in your home."
|
||||
not_available,switch.turn_off,warehouse_lights,Warehouse Lights Switch,,Turn off the <device_name>,"I'm sorry, I couldn't locate the <device_name> in your home."
|
||||
not_available,fan.turn_off,master_bath,Master bathroom fan,,Turn off the <device_name>,"I’m sorry, I can’t locate that fan in your home."
|
||||
not_available,garage_door.close_cover,carport,Carport Garage Door,,Close the <device_name> cover,"I’m sorry, but I can’t locate a <device_name> in your home to close."
|
||||
not_available,switch.toggle,gutter_heating,Gutter heating control,,Toggle the <device_name> switch,"I’m sorry, but I can’t locate a device named <device_name> in your home."
|
||||
not_available,fan.decrease_speed,outdoor_kitchen,Outdoor kitchen fan,,Decrease the speed of <device_name>,"I’m sorry, I can’t locate that fan in your home."
|
||||
already_state,lock.lock,office,Office Lock,locked,Lock the <device_name>.,"Sorry, the <device_name> is already locked, so there's nothing to change."
|
||||
not_available,lock.lock,utility_room,Utility room lock,,Lock the <device_name>,"I'm sorry, I can't locate that device in your home."
|
||||
already_state,switch.turn_on,deck_lights,Deck Lighting Switch,on,Turn on the <device_name>.,"Sorry, the <device_name> is already on, so there's nothing to change."
|
||||
already_state,light.turn_on,master_bedroom_1,Master Bedroom Lights,on,turn on <device_name> to 51% brightness,"The light is already on at that level, so there's nothing to change."
|
||||
not_available,light.turn_on,office_desk,Office Desk Light,,Turn on the <device_name> light to green,"I’m sorry, but I can’t locate that device in your home."
|
||||
not_available,switch.toggle,master_bedroom_lights,Master Bedroom Lights Switch,,Toggle the <device_name>,"I’m sorry, I can’t find that device in your home."
|
||||
not_available,light.toggle,philips_hue_2,Philips Hue,,Toggle the <device_name>,"I’m sorry, but I can’t locate that device in your home."
|
||||
already_state,light.turn_on,patio,Patio Lights,on,Turn on the <device_name>.,"The <device_name> is already on, so there's nothing to change."
|
||||
already_state,media_player.turn_off,home_theater,Home Theater Media,off,Turn off <device_name>,"Sorry, <device_name> is already off, so there's nothing to change."
|
||||
already_state,blinds.close_cover,morning_room,Morning room blinds,closed,Close the <device_name> blinds,"The <device_name> is already closed, so no action is needed."
|
||||
not_available,switch.toggle,fountain_pump,Fountain Pump Switch,,Toggle the <device_name>,"I’m sorry, I can’t locate the <device_name> in your home."
|
||||
not_available,lock.unlock,workshop,Workshop Lock,,unlock <device_name>,"I’m sorry, I can’t locate <device_name> in your home, so I can’t unlock it."
|
||||
not_available,vacuum.stop,left_corner_bot,Left corner dirt sucker,,Stop the <device_name>,"I’m sorry, I can’t locate that device in your home."
|
||||
already_state,vacuum.start,dining_area_bissel,Dining area dirt remover,cleaning,Start the <device_name>.,"It's already cleaning, so there's nothing to change."
|
||||
already_state,vacuum.return_to_base,craft_room_helper,Craft room cleaning bot,docked,<device_name> return to base,"It's already docked, so there's nothing for me to do."
|
||||
already_state,lock.lock,den,Den Lock,locked,Lock <device_name>,"Sorry, <device_name> is already locked, so there's nothing to do."
|
||||
not_available,light.toggle,kitchen_mirror_cool,Kitchen Mirror Cool Light,,Toggle <device_name>,"I’m sorry, I can’t locate <device_name> in your home."
|
||||
not_available,media_player.volume_up,greenhouse_speaker,Greenhouse Speaker,,Volume up <device_name>,"I’m sorry, I can’t find <device_name> in your home to adjust the volume."
|
||||
not_available,vacuum.stop,above_stairs_robot,Above stairs dusting device,,Stop the <device_name>,"I’m sorry, I can’t locate that device in your home, so I can’t stop it."
|
||||
already_state,fan.turn_on,living_room_center,Center living room fan,on,Turn on the <device_name>,"Sorry, the <device_name> is already on, so there's nothing to change."
|
||||
not_available,garage_door.close_cover,shed_1,First shed door,,Close the <device_name> cover,"I’m sorry, I can’t locate a garage door in your home to close."
|
||||
not_available,blinds.close_cover,theater_room,Home theater blinds,,Close the <device_name> blinds,"I’m sorry, I can’t locate a <device_name> in your home."
|
||||
already_state,blinds.close_cover,garage,Garage Blinds,closed,Close the <device_name> blinds,"The blinds are already closed, so there's nothing to do."
|
||||
not_available,vacuum.return_to_base,basement_deebot,Basement deebot,,Return <device_name> to its base,"I’m sorry, but I can’t locate that device in your home."
|
||||
already_state,light.turn_on,downstairs_corridor_mqtt,Downstairs Corridor Light,on,Turn on the <device_name> with color red,"Sorry, the <device_name> is already on, so there's nothing to change."
|
||||
already_state,lock.lock,back_door,Back Door Lock,locked,Lock the <device_name>.,"Sorry, the <device_name> is already locked, so no action is needed."
|
||||
not_available,climate.set_temperature,honeywell_lyric_t6,Honeywell Lyric T6 Pro,,Set the temperature to 23°C on <device_name>.,"I’m sorry, I can’t locate <device_name> in your home."
|
||||
already_state,fan.turn_off,porch,Porch ceiling fan,off,Turn off the <device_name>,"Sorry, the fan is already off, so there's nothing to change."
|
||||
not_available,switch.turn_off,den_lights,Den Lights Switch,,Turn off the <device_name>.,"I’m sorry, I can’t locate that device in your home."
|
||||
already_state,vacuum.return_to_base,workshop_floor,Workshop floor cleaner,docked,Return <device_name> to base,"It's already docked, so there's nothing to do."
|
||||
not_available,fan.increase_speed,guest_room,Guest Room Fan,,Increase the speed of the <device_name>.,"I’m sorry, I can’t locate a <device_name> in your home."
|
||||
not_available,vacuum.stop,living_room_roomba,Living room vacuum,,stop <device_name>,"I’m sorry, I can’t locate that device in your home."
|
||||
already_state,light.turn_on,downstairs_entryway_mqtt,Downstairs Entryway Light,on,Turn on the <device_name> to white,"The <device_name> is already on, so no change is needed."
|
||||
not_available,switch.toggle,dining_room_lights,Dining Room Lights Switch,,Toggle <device_name>,"I’m sorry, but I can’t locate that device in your home."
|
||||
already_state,climate.turn_off,netatmo_smart,Netatmo Smart Thermostat,off,Turn off the <device_name> climate,"Sorry, the climate is already off, so there's nothing to change."
|
||||
already_state,fan.turn_on,kitchen_island,Cooling kitchen fan,on,turn on the <device_name>,"Sorry, the fan is already on, so there's nothing to change."
|
||||
not_available,lock.unlock,schlage_smart,Schlage Smart Lock,,Unlock the <device_name>.,"I’m sorry, but I can’t locate the <device_name> in your home."
|
||||
already_state,switch.turn_on,study_room_lights,Study Room Lights Switch,on,Turn on the <device_name>.,"Sorry, the <device_name> is already on, so there's nothing to change."
|
||||
not_available,climate.set_temperature,wine_cellar_cooling,Wine Cellar Climate Control,,Set the temperature of <device_name> to 18 degrees,"I'm sorry, I couldn't locate <device_name> in your home."
|
||||
not_available,climate.set_temperature,art_studio_climate,Art Studio Climate Control,,Set the temperature of <device_name> to 19 degrees.,"I’m sorry, but I can’t locate that device in your home."
|
||||
already_state,lock.unlock,boathouse,Boathouse Lock,unlocked,Unlock the <device_name>.,"The <device_name> is already unlocked, so there's nothing to do."
|
||||
not_available,switch.toggle,aquarium_filter,Aquarium filter switch,,Toggle the <device_name>,"I’m sorry, I can’t locate that device in your home."
|
||||
already_state,garage_door.close_cover,guest,Guest Garage Door,closed,Close the <device_name>.,"Sorry, the <device_name> is already closed, so there's nothing to do."
|
||||
not_available,garage_door.close_cover,auto_bay_left,Left auto bay door,,close the <device_name> cover,"I’m sorry, I can’t locate a garage door in your home to close."
|
||||
not_available,media_player.volume_down,home_theater_system_living_room,Living Room Home Theater,,Turn down the volume on <device_name>,"I’m sorry, I can’t locate <device_name> in your home."
|
||||
not_available,light.turn_on,kitchen_drawer_warm,Kitchen Drawer Warm Light,,Turn on the <device_name> to cool white,"I’m sorry, I can’t locate that device in your home."
|
||||
not_available,garage_door.toggle,main,Main Garage Door,,toggle the <device_name>,"I’m sorry, I can’t locate that device in your home."
|
||||
already_state,media_player.turn_on,ps5_living_room,Living room PS5,on,Turn on <device_name>,"Sorry, <device_name> is already on, so no action is needed."
|
||||
not_available,media_player.volume_up,sony_bravia_tv,Sony Smart LED TV,,Turn up the volume on <device_name>,"I’m sorry, I can’t locate <device_name> in your home."
|
||||
not_available,blinds.stop_cover,guest_room,Guest Room Blinds,,Stop the <device_name> blinds,"I’m sorry, I can’t find that blind in your home right now."
|
||||
not_available,media_player.volume_up,kitchen_radio,Kitchen Radio Player,,Turn up the volume on <device_name>,"I’m sorry, I can’t locate <device_name> in your home."
|
||||
not_available,vacuum.start,garage_roomba_2,Garage cleaning bot,,Start the <device_name>,"I’m sorry, I can’t locate that device in your home."
|
||||
not_available,fan.turn_off,attic,Attic Fan,,Turn off the <device_name>.,"I’m sorry, I can’t locate that device in your home."
|
||||
not_available,fan.decrease_speed,mudroom,Mudroom fan,,Decrease the speed of the <device_name> fan,"I’m sorry, I can’t locate that fan in your home."
|
||||
already_state,climate.turn_off,carrier_cor,Carrier Cor Wi-Fi Thermostat,off,Turn off the <device_name> climate,"The <device_name> is already off, so there's nothing to change."
|
||||
not_available,switch.toggle,hallway_lights,Hallway Lights Switch,,Toggle the <device_name>.,"I’m sorry, but I can’t find that device in your home."
|
||||
not_available,fan.turn_off,workshop_ceiling,Workshop ceiling fan,,Turn off the <device_name>.,"I’m sorry, I can’t locate that device in your home."
|
||||
not_available,blinds.close_cover,greenhouse_south,South greenhouse blinds,,Close the <device_name> blinds,"I’m sorry, I can’t locate that device in your home."
|
||||
not_available,climate.turn_off,art_studio_climate,Art Studio Climate Control,,Turn off the <device_name>.,"I’m sorry, I can’t locate a <device_name> in your home to turn off."
|
||||
not_available,vacuum.return_to_base,workshop_floor,Workshop floor cleaner,,return <device_name> to base,"Sorry, I can't locate that device in your home."
|
||||
not_available,climate.set_temperature,server_room_cooling,Server Room Cooling,,Set the temperature of <device_name> to 27 degrees,"I’m sorry, I can’t locate <device_name> in your home."
|
||||
already_state,climate.turn_on,humidor_control,Humidor Climate Control,on,Turn on the <device_name>,"The <device_name> is already on, so no action is needed."
|
||||
not_available,media_player.media_play_pause,lounge_hi_fi_system,Lounge Hi-Fi Audio,,Play or pause <device_name>,"I’m sorry, I can’t locate <device_name> in your home."
|
||||
not_available,fan.increase_speed,shed,Shed fan,,Increase the speed of <device_name>,"I'm sorry, I couldn't locate <device_name> in your home."
|
||||
|
File diff suppressed because it is too large
Load Diff
124
data/piles/french/pile_of_failed_tool_calls.csv
Normal file
124
data/piles/french/pile_of_failed_tool_calls.csv
Normal file
@@ -0,0 +1,124 @@
|
||||
service_name,correct_device_name,correct_friendly_name,bad_device_name,phrase,error_result,retry_prompt
|
||||
light.turn_on,light.living_room_lamp,Lampe du salon,light.livng_room_lamp,"Veuillez allumer la <device_name>.","Erreur : entité light.livng_room_lamp introuvable.","Je vais essayer la lampe du salon à la place."
|
||||
climate.set_temperature,climate.hallway,Thermostat du couloir,climate.halway,"Règle la <device_name> à <temp_f> degrés.","Erreur : entité climate.halway introuvable.","Nouvelle tentative avec le thermostat du couloir."
|
||||
fan.turn_off,fan.office,Ventilateur du bureau,fan.offce,"Éteins le <device_name>.","Erreur : entité fan.offce introuvable.","Je vais réessayer avec le ventilateur du bureau."
|
||||
garage_door.open_cover,garage_door.liftmaster_1,LiftMaster,garage_door.lift_master_1,"Ouvre le couvercle du garage, s'il te plaît.","<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='garage_door.lift_master_1', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","D'accord, je réessaie avec le bon dispositif : garage_door.liftmaster_1."
|
||||
light.turn_on,light.front_sunroom_ge,Lumière de véranda avant,light.front_sunroom_ge_extra,"Allume la lumière de la véranda avant en blanc, s'il te plaît.","<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='light.front_sunroom_ge_extra', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Pas de problème, je réessaie avec la bonne lumière."
|
||||
light.turn_on,light.philips_hue_1,Philips Hue,light.philips_hue_1_main,"Allume la lumière du salon, s'il te plaît.","<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='light.philips_hue_1_main', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Très bien, je réessaie avec le dispositif correct."
|
||||
lock.unlock,lock.la_porte_du_patio,Porte patio coulissante,lock.patio_du_porte,Peux-tu déverrouiller la porte patio coulissante ?,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='lock.patio_du_porte', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Très bien, je réessaie avec la porte patio coulissante."
|
||||
fan.increase_speed,fan.grenier_ventilation,Ventilateur de grenier,fan.grenierventilation_plus,"Augmente la vitesse du ventilateur du grenier, s'il te plaît.","<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='fan.grenierventilation_plus', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>",Je réessaie avec le bon appareil : fan.grenier_ventilation.
|
||||
media_player.turn_off,media_player.sonos_beam,Barre de son compacte Sonos,media_player.sonos_beam_salon,"Éteins la barre de son compacte Sonos, s'il te plaît.","<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='media_player.sonos_beam_salon', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Très bien, je réessaie avec la bonne barre de son."
|
||||
switch.toggle,switch.front_gate_lighting,Interrupteur des feux de porte avant,switch.front_gate_lightings,"Allume les feux de la porte avant, s'il te plaît.","<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='switch.front_gate_lightings', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","D'accord, je réessaie avec l'interrupteur des feux de porte avant."
|
||||
vacuum.stop,vacuum.patio_doorway_vac,Nettoyant pour porte-patio,vacuum.patio_doorway_vacx,"Arrête le nettoyant pour porte-patio, s'il te plaît.","<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='vacuum.patio_doorway_vacx', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>",Je réessaie avec le bon appareil.
|
||||
climate.turn_off,climate.netatmo_smart,Thermostat Intelligent Netatmo,climate.netatmo_sma,"Éteins le thermostat intelligent Netatmo, s'il te plaît.","<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='climate.netatmo_sma', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Très bien, je réessaie avec le bon appareil : climate.netatmo_smart."
|
||||
switch.turn_off,switch.salle_à_manger_lights,Interrupteur d'éclairage de salle à manger,switch.salle_à_manger_lumens,Éteins les lumières de la salle à manger.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='switch.salle_à_manger_lumens', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","D'accord, j'essaie avec le bon interrupteur."
|
||||
blinds.stop_cover,blinds.fenêtre_arrière,Stores de fenêtre arrière,blinds.fenêtre_arriè,Arrête les stores de la fenêtre arrière.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='blinds.fenêtre_arriè', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","D'accord, je réessaie avec les stores de fenêtre arrière."
|
||||
fan.decrease_speed,fan.salle_de_bain_bas,Ventilateur dans la salle de bain du rez-de-chaussée,fan.salle_de_bain_basse,Baisse la vitesse du ventilateur de la salle de bain du rez-de-chaussée.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='fan.salle_de_bain_basse', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>",Je réessaie avec le bon dispositif : fan.salle_de_bain_bas.
|
||||
lock.lock,lock.porte_latérale,Serrure de portail latérale,lock.porte_latérale_ext,"Verrouille la porte latérale du garage, s'il te plaît.","<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='lock.porte_latérale_ext', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","D'accord, je réessaie avec la serrure correcte."
|
||||
light.toggle,light.cuisine_étagère_cool,Étagère de cuisine lumière froide,light.cuisine_étagère_cooler,Peux-tu allumer ou éteindre la lumière de l'étagère de cuisine froide ?,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='light.cuisine_étagère_cooler', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>",Je réessaye avec l'étagère de cuisine lumière froide.
|
||||
climate.turn_off,climate.netatmo_smart,Thermostat Intelligent Netatmo,climate.netatmo_sma,Éteins le thermostat intelligent.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='climate.netatmo_sma', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Très bien, je réessaie avec le thermostat Netatmo."
|
||||
garage_door.open_cover,garage_door.sous_sol,Porte de garage du sous-sol,garage_door.sous_sol_porte,"Ouvre la couverture du garage du sous‑sol, s'il te plaît.","<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='garage_door.sous_sol_porte', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","D'accord, je réessaie avec le bon appareil."
|
||||
light.turn_off,light.front_recreation_ge,Lumière de loisirs avant,light.front_recreation_ge_bis,"Éteins la Lumière de loisirs avant, s'il te plaît.","<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='light.front_recreation_ge_bis', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","D'accord, je réessaye avec la bonne lumière."
|
||||
blinds.close_cover,blinds.salon_room_large,Stores du salon principal,blinds.salon_room_largex,Ferme les stores du salon principal.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='blinds.salon_room_largex', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Très bien, je réessaie avec les Stores du salon principal."
|
||||
vacuum.stop,vacuum.front_hall_samsung,Robot de balayage du hall d'entrée,vacuum.front_hall_samsung_pro,"Arrête le robot de balayage du hall d'entrée, s'il te plaît.","<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='vacuum.front_hall_samsung_pro', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Très bien, je réessaye avec le bon appareil."
|
||||
vacuum.stop,vacuum.patio_doorway_vac,Nettoyant pour porte-patio,vacuum.patio_doorway,"Arrête le nettoyant pour porte-patio, s'il te plaît.","<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='vacuum.patio_doorway', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>",Je réessaie avec le bon appareil.
|
||||
vacuum.stop,vacuum.à_l'étage_salle_de_bain_vac,Aide à la salle de bain à l'étage,vacuum.à_l'étage_salle_de_bain,"Arrête le robot aspirateur de la salle de bain à l'étage, s'il te plaît.","<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='vacuum.à_l'étage_salle_de_bain', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","D'accord, je réessaie avec le bon dispositif."
|
||||
climate.turn_off,climate.mysa_smart_thermostat,Thermostat intelligent Mysa pour plinthes électriques,climate.mysa_thermostat_smart_pro,Éteins le thermostat intelligent Mysa pour plinthes électriques.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='climate.mysa_thermostat_smart_pro', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Très bien, je réessaie avec le bon thermostat."
|
||||
climate.turn_on,climate.honeywell_lyric_t6,Honeywell Lyric T6 Pro,climate.honeywell_lyric_t6_pro,"Allume le chauffage dans le salon, s'il te plaît.","<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='climate.honeywell_lyric_t6_pro', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Très bien, je réessaie avec le thermostat Honeywell Lyric T6."
|
||||
fan.turn_on,fan.chambre_d'amis,Ventilateur de chambre d'amis,fan.chambre_amis,"Allume le ventilateur de la chambre d'amis, s'il te plaît.","<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='fan.chambre_amis', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>",Je réessaye avec le ventilateur de la chambre d'amis.
|
||||
media_player.volume_down,media_player.garage_atelier_stéréo,Stéréo Garage Atelier,media_player.stéréo_garage_atelier,Baisse le volume de la Stéréo du garage atelier.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='media_player.stéréo_garage_atelier', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Très bien, je réessaie avec le bon appareil."
|
||||
media_player.volume_down,media_player.sous_sol,Lecteur multimédia du sous-sol,media_player.soussol,Baisse le volume du lecteur multimédia du sous-sol.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='media_player.soussol', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Très bien, j'utilise le bon appareil : Lecteur multimédia du sous-sol."
|
||||
vacuum.stop,vacuum.entrée_eufy,Dépoussiéreur d'entrée,vacuum.entr_eufy,"Arrête le dépoussiéreur d'entrée, s'il te plaît.","<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='vacuum.entr_eufy', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","D'accord, je réessaye avec le bon appareil."
|
||||
climate.turn_off,climate.netatmo_smart,Thermostat Intelligent Netatmo,climate.netatmo_smar,Éteins le thermostat intelligent Netatmo.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='climate.netatmo_smar', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Très bien, je réessaie avec le bon appareil."
|
||||
light.turn_on,light.chambre_2,Lumière de la chambre,light.chambre_2_ext,"Allume la lumière de la chambre en violet, s'il te plaît.","<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='light.chambre_2_ext', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Très bien, je réessaie avec la lumière de la chambre."
|
||||
switch.turn_off,switch.lumières_sous_sol,Interrupteur des lumières du sous-sol,switch.lumières_sous,"Éteins les lumières du sous‑sol, s'il te plaît.","<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='switch.lumières_sous', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>",Je réessaie avec le bon appareil : switch.lumières_sous_sol.
|
||||
switch.turn_on,switch.front_gate_lighting,Interrupteur des feux de porte avant,switch.front_gate_light,"Allume les feux de la porte avant, s'il te plaît.","<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='switch.front_gate_light', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Très bien, je réessaie avec l'Interrupteur des feux de porte avant."
|
||||
blinds.close_cover,blinds.ikea_smart,Stores intelligents Ikea,blinds.ikea_smart_v2,"Ferme les stores intelligents Ikea, s'il te plaît.","<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='blinds.ikea_smart_v2', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","D'accord, je réessaie avec le bon dispositif."
|
||||
blinds.stop_cover,blinds.salle_de_bain_1,Premiers stores de salle de bain,blinds.salle_de_bain_01,"Arrête les stores de la salle de bain, s'il te plaît.","<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='blinds.salle_de_bain_01', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Très bien, je réessaie avec le bon dispositif."
|
||||
blinds.stop_cover,blinds.fenêtre_arrière,Stores de fenêtre arrière,blinds.fenêtre_arriè,Arrête les stores de la fenêtre arrière.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='blinds.fenêtre_arriè', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>",Je réessaie avec le bon appareil.
|
||||
vacuum.stop,vacuum.chambre_invité_en_bas,Chambre d'amis en bas,vacuum.chambre_invité_en,"Arrête l'aspirateur de la chambre d'amis en bas, s'il te plaît.","<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='vacuum.chambre_invité_en', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","D'accord, je réessaye avec le bon appareil : vacuum.chambre_invité_en_bas."
|
||||
lock.lock,lock.porte_terrasse,Serrure de porte de terrasse,lock.porte_terrasse_ext,"Verrouille la porte de la terrasse, s'il te plaît.","<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='lock.porte_terrasse_ext', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","D'accord, je réessaie avec la bonne serrure : lock.porte_terrasse."
|
||||
climate.turn_off,climate.emerson_sensi_touch,Thermostat Wi-Fi Emerson Sensi Touch,climate.emerson_sensi_touch_v2,Éteins le thermostat Wi‑Fi de la salle de séjour.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='climate.emerson_sensi_touch_v2', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Très bien, je réessaie avec le thermostat correct."
|
||||
vacuum.stop,vacuum.couloir_neato,Nettoyant pour allées de couloir,vacuum.couloirneato,"Arrête le robot aspirateur du couloir, s'il te plaît.","<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='vacuum.couloirneato', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","D'accord, j'essaie avec le bon appareil."
|
||||
vacuum.return_to_base,vacuum.salon_room_roomba,Aspirateur de salon,vacuum.salonroom_roomba_plus,"Aspirateur de salon, retourne à la base s'il te plaît.","<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='vacuum.salonroom_roomba_plus', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","D'accord, je réessaie avec l'Aspirateur de salon."
|
||||
media_player.volume_down,media_player.cinéma_maison,Médias de cinéma maison,media_player.cinéma_maison_salon,"Baisse le volume du cinéma maison, s'il te plaît.","<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='media_player.cinéma_maison_salon', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","D'accord, je réessaie avec le bon appareil."
|
||||
blinds.toggle,blinds.salle_de_bain,Stores de salle de bain,blinds.salle_de_bains,Ferme les stores de la salle de bain.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='blinds.salle_de_bains', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Très bien, je réessaie avec le bon dispositif."
|
||||
lock.unlock,lock.chambre_2,Serrure de la deuxième chambre,lock.chambre_deux,"Peux-tu déverrouiller la serrure de la deuxième chambre, s'il te plaît ?","<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='lock.chambre_deux', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","D'accord, je réessaie avec la bonne serrure de la deuxième chambre."
|
||||
blinds.close_cover,blinds.chambre_d'amis,Stores de chambre d'amis,blinds.chambre_d'ami,"Ferme les stores de la chambre d'amis, s'il te plaît.","<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='blinds.chambre_d'ami', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","D'accord, je réessaie avec le bon dispositif."
|
||||
garage_door.stop_cover,garage_door.voiturette_de_golf,Porte de voiturette de golf,garage_door.voiturette_golf,Arrête la porte du garage de la voiturette de golf.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='garage_door.voiturette_golf', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Très bien, je réessaie avec la porte de la voiturette de golf."
|
||||
vacuum.stop,vacuum.patio_doorway_vac,Nettoyant pour porte-patio,vacuum.patio_doorway,Arrête le nettoyant pour porte-patio.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='vacuum.patio_doorway', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Très bien, je réessaie avec le bon dispositif."
|
||||
vacuum.return_to_base,vacuum.left_corner_bot,Aspirateur de saleté du coin gauche,vacuum.left_corn_bot,"Aspirateur de saleté du coin gauche, retourne à la base s'il te plaît.","<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='vacuum.left_corn_bot', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","D'accord, je réessaie avec l'aspirateur du coin gauche."
|
||||
fan.turn_off,fan.grenier_2,Ventilateurs de grenier,fan.grenier_2a,"Éteins le ventilateur du grenier, s'il te plaît.","<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='fan.grenier_2a', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Très bien, je réessaie avec le bon appareil."
|
||||
blinds.stop_cover,blinds.salle_de_bain_1,Premiers stores de salle de bain,blinds.salle_bain_1,Arrête les stores de la salle de bain.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='blinds.salle_bain_1', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","D'accord, je réessaie avec le bon appareil."
|
||||
climate.turn_off,climate.johnson_glas,Thermostat intelligent GLAS de Johnson Controls,climate.johnson_glass,"Éteins le thermostat intelligent GLAS de Johnson Controls, s'il te plaît.","<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='climate.johnson_glass', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>",Je réessaye avec le bon thermostat.
|
||||
vacuum.return_to_base,vacuum.entrée_eufy,Dépoussiéreur d'entrée,vacuum.entrée_eufy_v2,Ramène le dépoussiéreur d'entrée à sa base.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='vacuum.entrée_eufy_v2', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Très bien, je réessaie avec le bon appareil."
|
||||
climate.set_temperature,climate.tado_smart,Thermostat intelligent Tado,climate.tado_smart_pro,Peux-tu régler le thermostat à <temp_f> degrés ?,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='climate.tado_smart_pro', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","D'accord, je réessaie avec le thermostat Tado."
|
||||
vacuum.start,vacuum.salle_à_manger_area_bissel,Détachant la saleté de la salle à manger,vacuum.salle_à_manger_area_biss,"Démarre le robot aspirateur dans la salle à manger, s'il te plaît.","<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='vacuum.salle_à_manger_area_biss', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Très bien, je réessaie avec le bon appareil."
|
||||
blinds.close_cover,blinds.somfy_cuisine,Stores de cuisine,blinds.cuisine_somfy,Ferme les stores de la cuisine.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='blinds.cuisine_somfy', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","D'accord, je réessaie avec les stores de cuisine."
|
||||
light.turn_on,light.front_utility_ge,Éclairage utilitaire avant,light.front_utility_gear,"Allume l'éclairage utilitaire avant, s'il te plaît.","<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='light.front_utility_gear', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","D'accord, je réessaye avec l'éclairage utilitaire avant."
|
||||
media_player.turn_off,media_player.bang_olufsen_beovision,Télévision haut de gamme B&O,media_player.bang_olufsen_beovisio,"Éteins la télévision haut de gamme B&O, s'il te plaît.","<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='media_player.bang_olufsen_beovisio', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","D'accord, je réessaye avec le bon appareil."
|
||||
vacuum.return_to_base,vacuum.couloir_neato,Nettoyant pour allées de couloir,vacuum.couloir_neatox,"Assistant, renvoie le nettoyant pour allées de couloir à sa base.","<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='vacuum.couloir_neatox', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Très bien, je réessaye avec le bon appareil."
|
||||
garage_door.close_cover,garage_door.principal,Porte de garage principale,garage_door.principal_ext,Ferme la porte du garage principale.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='garage_door.principal_ext', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>",Je réessaye avec la porte de garage principale.
|
||||
blinds.close_cover,blinds.chambre_des_enfants,Stores pour chambres d'enfants,blinds.chambre_des_enfants_v2,"Ferme les stores de la chambre des enfants, s'il te plaît.","<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='blinds.chambre_des_enfants_v2', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","D'accord, je réessaie avec le bon appareil."
|
||||
vacuum.stop,vacuum.left_corner_bot,Aspirateur de saleté du coin gauche,vacuum.corner_left_bot,"Arrête l'aspirateur du coin gauche, s'il te plaît.","<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='vacuum.corner_left_bot', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Très bien, je réessaie avec l'aspirateur de saleté du coin gauche."
|
||||
fan.increase_speed,fan.chambre_à_coucher,Ventilateur de chambre,fan.chambre_à_couché,"Augmente la vitesse du ventilateur de la chambre, s'il te plaît.","<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='fan.chambre_à_couché', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Très bien, je réessaye avec le ventilateur de chambre."
|
||||
vacuum.start,vacuum.right_stairwell_sweeper,Nettoyeur d'escalier droit,vacuum.right_stairwell_swipper,"Démarre le nettoyeur d'escalier droit, s'il te plaît.","<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='vacuum.right_stairwell_swipper', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","D'accord, je réessaye avec le bon appareil."
|
||||
lock.unlock,lock.salle_de_sport,Serrure de salle de sport à domicile,lock.salle_de_spor,Déverrouille la serrure de la salle de sport à domicile.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='lock.salle_de_spor', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Très bien, je réessaie avec la bonne serrure."
|
||||
lock.lock,lock.chenil,Serrure pour chenil pour animaux,lock.chenil_ext,Verrouille la serrure du chenil pour animaux.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='lock.chenil_ext', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Très bien, j'utilise la bonne serrure du chenil."
|
||||
switch.turn_off,switch.guest_room_lights,Interrupteur d'éclairage de chambre d'amis,switch.guest_room_lights_extra,Éteins les lumières de la chambre d'amis.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='switch.guest_room_lights_extra', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>",Je réessaie avec l'interrupteur correct.
|
||||
vacuum.start,vacuum.kitchen_xiaomi,Aspirateur de cuisine,vacuum.kithen_xiaomi,Peux-tu démarrer l'aspirateur de la cuisine ?,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='vacuum.kithen_xiaomi', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","D'accord, j'essaie avec l'aspirateur de cuisine."
|
||||
climate.turn_off,climate.sinope_smart,Thermostat intelligent Sinopé,climate.sinope_smart_plus,Éteins le thermostat intelligent Sinopé.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='climate.sinope_smart_plus', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","D'accord, je réessaie avec le thermostat intelligent Sinopé."
|
||||
media_player.volume_up,media_player.cuisine_radio,Lecteur radio de cuisine,media_player.cuisine_radiox,Augmente le volume du lecteur radio de cuisine.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='media_player.cuisine_radiox', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Très bien, je réessaie avec le lecteur radio de cuisine."
|
||||
light.turn_on,light.back_sunroom_warm,Lumière chaude de la véranda arrière,light.back_sunroom_warm_extra,"Allume la lumière chaude de la véranda arrière, s'il te plaît.","<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='light.back_sunroom_warm_extra', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Très bien, je réessaie avec la bonne lumière."
|
||||
fan.increase_speed,fan.chambre_des_enfants,Ventilateur pour chambre d'enfant,fan.chambre_des_enfants,Augmente la vitesse du ventilateur pour la chambre d'enfant.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='fan.chambre_des_enfants', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","D'accord, j'essaie avec le bon dispositif."
|
||||
lock.lock,lock.buanderie,Serrure de buanderie,lock.buanderie_extra,"Verrouille la serrure de la buanderie, s'il te plaît.","<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='lock.buanderie_extra', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>",Je réessaie avec la serrure de buanderie.
|
||||
climate.turn_off,climate.zen_wifi_thermostat,Thermostat Zen Édition WiFi,climate.zen_wifi_thermostat_pro,Éteins le thermostat Zen Édition WiFi.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='climate.zen_wifi_thermostat_pro', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>",Je réessaie avec le thermostat Zen Édition WiFi.
|
||||
climate.turn_off,climate.nest_learning,Thermostat d'apprentissage Nest,climate.nst_learning,Éteins le thermostat d'apprentissage Nest.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='climate.nst_learning', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Très bien, je vais essayer avec le thermostat Nest."
|
||||
fan.turn_off,fan.chambre_maître,Ventilateur de la chambre principale,fan.chambre_maître_salon,"Éteins le ventilateur de la chambre principale, s'il te plaît.","<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='fan.chambre_maître_salon', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","D'accord, je réessaie avec le bon appareil."
|
||||
fan.decrease_speed,fan.chambre_des_enfants,Ventilateur pour chambre d'enfant,fan.chambre_des_enfant,"Baisse la vitesse du ventilateur de la chambre d'enfant, s'il te plaît.","<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='fan.chambre_des_enfant', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","D'accord, je réessaye avec le bon ventilateur."
|
||||
switch.toggle,switch.atelier_lights,Interrupteur d'éclairage d'atelier,switch.atelier_lights_v2,Bascule l'interrupteur d'éclairage d'atelier.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='switch.atelier_lights_v2', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>",Je réessaye avec l'interrupteur d'éclairage d'atelier.
|
||||
climate.turn_off,climate.zen_wifi_thermostat,Thermostat Zen Édition WiFi,climate.zen_thermostat_wifi,Éteins le thermostat Zen Édition WiFi,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='climate.zen_thermostat_wifi', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","D'accord, je réessaye avec le thermostat Zen."
|
||||
switch.turn_on,switch.lumières_sauna,Interrupteur pour lumières de sauna,switch.lumières_suana,"Allume les lumières du sauna, s'il te plaît.","<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='switch.lumières_suana', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Très bien, je réessaye avec l'interrupteur correct."
|
||||
lock.lock,lock.porte_sur_le_toit,Serrure d'accès au toit,lock.porte_sur_le,"Verrouille la serrure d'accès au toit, s'il te plaît.","<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='lock.porte_sur_le', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Très bien, je réessaie avec la Serrure d'accès au toit."
|
||||
switch.turn_on,switch.lumières_cuisine,Interrupteur d'éclairage de cuisine,switch.cuisine_lumières,"Allume les lumières de la cuisine, s'il te plaît.","<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='switch.cuisine_lumières', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Très bien, je réessaie avec l'interrupteur d'éclairage de cuisine."
|
||||
light.turn_off,light.cuisine,Lumière de cuisine,light.cuisinex,"Éteins la lumière de la cuisine, s'il te plaît.","<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='light.cuisinex', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Très bien, je réessaie avec la lumière de cuisine."
|
||||
lock.lock,lock.porte_vélos,Antivol pour porte-vélos,lock.porte_velosX,Peux-tu verrouiller l'antivol de la porte‑vélos ?,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='lock.porte_velosX', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","D'accord, je réessaie avec l'antivol pour porte‑vélos."
|
||||
switch.turn_on,switch.atelier_lights,Interrupteur d'éclairage d'atelier,switch.lights_atelier,"Allume les lumières de l'atelier, s'il te plaît.","<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='switch.lights_atelier', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Très bien, je réessaye avec l'interrupteur d'éclairage d'atelier."
|
||||
media_player.media_play_pause,media_player.sunroom_cd_player,Lecteur CD dans la véranda,media_player.sunroom_cd,Peux-tu mettre en pause le lecteur CD dans la véranda ?,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='media_player.sunroom_cd', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Très bien, je réessaie avec le bon appareil."
|
||||
vacuum.return_to_base,vacuum.entrée_eufy,Dépoussiéreur d'entrée,vacuum.eufy_entrée,"Ramène le dépoussiéreur d'entrée à sa base, s'il te plaît.","<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='vacuum.eufy_entrée', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","D'accord, je réessaie avec le dépoussiéreur d'entrée."
|
||||
climate.turn_off,climate.kono_thermostat,Thermostat intelligent Kono,climate.kono_thermostat_pro,"Éteins le thermostat intelligent Kono, s'il te plaît.","<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='climate.kono_thermostat_pro', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Très bien, je réessaye avec le thermostat intelligent Kono."
|
||||
blinds.toggle,blinds.couloir_2,Stores du deuxième couloir,blinds.couloir_2b,Baisse les stores du deuxième couloir.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='blinds.couloir_2b', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","D'accord, je réessaie avec les Stores du deuxième couloir."
|
||||
blinds.toggle,blinds.patio,Stores de terrasse,blinds.patio_terrasse,Peux-tu ouvrir les stores de la terrasse ?,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='blinds.patio_terrasse', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","D'accord, je réessaie avec les Stores de terrasse."
|
||||
climate.turn_on,climate.zen_wifi_thermostat,Thermostat Zen Édition WiFi,climate.zenwifi_thermostat,"Peux-tu allumer le thermostat Zen WiFi, s'il te plaît ?","<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='climate.zenwifi_thermostat', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","D'accord, je réessaye avec le thermostat Zen Édition WiFi."
|
||||
climate.turn_off,climate.mysa_smart_thermostat,Thermostat intelligent Mysa pour plinthes électriques,climate.mysa_smart_thermostat_v2,Éteins le thermostat intelligent Mysa pour les plinthes électriques.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='climate.mysa_smart_thermostat_v2', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>",Je réessaye avec le bon thermostat.
|
||||
media_player.volume_down,media_player.vizio_smartcast_tv,Téléviseur compatible Vizio Cast,media_player.vizio_smartcaste_tv,Baisse le volume du téléviseur Vizio Cast.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='media_player.vizio_smartcaste_tv', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Très bien, je réessaye avec le bon appareil."
|
||||
light.turn_off,light.downstairs_utility_homekit,Lumière utilitaire en bas,light.utility_downstairs_homekit,"Éteins la lumière utilitaire en bas, s'il te plaît.","<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='light.utility_downstairs_homekit', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Très bien, je réessaie avec le bon appareil."
|
||||
switch.turn_off,switch.lumières_entrepôt,Interrupteur de lumières d'entrepôt,switch.lumière_entrepôt,"Éteins les lumières de l'entrepôt, s'il te plaît.","<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='switch.lumière_entrepôt', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>",Je réessaie avec l'interrupteur de lumières d'entrepôt.
|
||||
switch.toggle,switch.lumières_entrepôt,Interrupteur de lumières d'entrepôt,switch.lumier_entrepôt,"Bascule les lumières de l'entrepôt, s'il te plaît.","<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='switch.lumier_entrepôt', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","D'accord, je réessaie avec l'interrupteur de lumières d'entrepôt."
|
||||
blinds.stop_cover,blinds.fenêtre_arrière,Stores de fenêtre arrière,blinds.fenêtre_arrièree,"Arrête les stores de la fenêtre arrière, s'il te plaît.","<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='blinds.fenêtre_arrièree', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","D'accord, je réessaie avec le bon dispositif : blinds.fenêtre_arrière."
|
||||
fan.turn_on,fan.le_porche,Ventilateur de porche,fan.le_porché,Peux-tu allumer le ventilateur du porche ?,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='fan.le_porché', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","D'accord, je réessaye avec le bon appareil (fan.le_porche)."
|
||||
vacuum.stop,vacuum.garage_roomba_2,Robot de nettoyage de garage,vacuum.garage_roomba_2_extra,"Arrête le robot de nettoyage du garage, s'il te plaît.","<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='vacuum.garage_roomba_2_extra', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Très bien, je tente avec le bon appareil."
|
||||
blinds.close_cover,blinds.garderie,Stores de chambre d'enfant,blinds.garde,"Ferme les stores de la chambre d'enfant, s'il te plaît.","<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='blinds.garde', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Très bien, je réessaye avec les stores de la chambre d'enfant."
|
||||
lock.lock,lock.cave_à_vin,Serrure de cave à vin,lock.cave_vin,"Verrouille la cave à vin, s'il te plaît.","<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='lock.cave_vin', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>",Je réessaie avec la serrure de la cave à vin.
|
||||
fan.increase_speed,fan.étude,fan d'étude,fan.etudex,"Augmente la vitesse du ventilateur d'étude, s'il te plaît.","<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='fan.etudex', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","D'accord, je réessaie avec le ventilateur d'étude."
|
||||
fan.turn_off,fan.chambre_des_enfants,Ventilateur pour chambre d'enfant,fan.chambre_des_enfan,"Éteins le ventilateur de la chambre d'enfant, s'il te plaît.","<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='fan.chambre_des_enfan', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Très bien, je réessaie avec le ventilateur pour la chambre d'enfant."
|
||||
vacuum.start,vacuum.couloir_neato,Nettoyant pour allées de couloir,vacuum.couloir_neato_pro,"Démarre le nettoyant pour allées de couloir, s'il te plaît.","<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='vacuum.couloir_neato_pro', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Très bien, je réessaie avec le bon appareil."
|
||||
vacuum.start,vacuum.salle_à_manger_area_bissel,Détachant la saleté de la salle à manger,vacuum.salle_à_manger_zone_bissel,"Démarre le robot aspirateur dans la salle à manger, s'il te plaît.","<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='vacuum.salle_à_manger_zone_bissel', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Très bien, je réessaie avec le bon appareil."
|
||||
garage_door.toggle,garage_door.abri_d'auto,Porte de garage pour abri d'auto,garage_door.abri_auto,Peux-tu ouvrir la porte du garage pour l'abri d'auto ?,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='garage_door.abri_auto', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","D'accord, je réessaie avec la porte de garage pour abri d'auto."
|
||||
garage_door.close_cover,garage_door.côté,Porte de garage latérale,garage_door.côté_porte,Ferme la porte de garage latérale.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='garage_door.côté_porte', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","D'accord, j'essaie avec la bonne entité."
|
||||
switch.turn_off,switch.water_feature_lights,Interrupteur d'éclairage de jeu d'eau,switch.water_features_lights,"Éteins les lumières du jeu d'eau, s'il te plaît.","<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='switch.water_features_lights', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>",Je réessaye avec l'interrupteur correct.
|
||||
light.turn_off,light.salon,Lumière du salon,light.sallon,"Éteins la lumière du salon, s'il te plaît.","<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='light.sallon', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Très bien, je réessaie avec la lumière du salon."
|
||||
light.turn_off,light.back_family_room_warm,"Salle familiale arrière, lumière chaude",light.back_familyroom_warm,"Éteins la lumière de la salle familiale arrière, s'il te plaît.","<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='light.back_familyroom_warm', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>",Je réessaye avec la bonne lumière (light.back_family_room_warm).
|
||||
light.toggle,light.upstairs_children_chambre_zigbee,Lampe de chambre d'enfant à l'étage,light.upstairs_chambre_children_zigbee,Allume la lampe de la chambre d'enfant à l'étage.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='light.upstairs_chambre_children_zigbee', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","D'accord, je réessaie avec la lampe de la chambre d'enfant à l'étage."
|
||||
light.turn_on,light.lustre_salle_à_manger,Lustre de salle à manger,light.lustre_à_manger_salle,"Allume le lustre de la salle à manger à 90 % de luminosité, s'il te plaît.","<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='light.lustre_à_manger_salle', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Très bien, je réessaye avec le lustre de la salle à manger."
|
||||
fan.increase_speed,fan.extérieur,Ventilateur extérieur,fan.extérieur2,"Augmente la vitesse du ventilateur extérieur, s'il te plaît.","<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='fan.extérieur2', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","D'accord, je réessaie avec le ventilateur extérieur."
|
||||
fan.turn_off,fan.salon_chambre_1,Ventilateur du salon,fan.salon_chambre_un,"Éteins le ventilateur du salon, s'il te plaît.","<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='fan.salon_chambre_un', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","D'accord, j'essaie maintenant avec le ventilateur du salon."
|
||||
garage_door.open_cover,garage_door.abri_d'auto,Porte d'abri de voiture,garage_door.abri_auto,"Ouvre le couvercle du garage, s'il te plaît.","<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='garage_door.abri_auto', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","D'accord, j'essaie avec le bon dispositif."
|
||||
blinds.toggle,blinds.chambre_d'amis,Stores de chambre d'amis,blinds.chambre_d'amis_extra,Ferme les stores de la chambre d'amis.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='blinds.chambre_d'amis_extra', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","D'accord, je réessaie avec le bon appareil."
|
||||
light.turn_on,light.chambre_3,Lumière de la chambre,light.chambre_33,"Allume la lumière de la chambre, s'il te plaît.","<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='light.chambre_33', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Très bien, je réessaye avec la bonne lampe."
|
||||
fan.turn_off,fan.salle_à_manger,Ventilateur de salle à manger,fan.salle_à_manger_2,"Éteins le ventilateur de la salle à manger, s'il te plaît.","<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='fan.salle_à_manger_2', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Très bien, je réessaie avec le ventilateur de la salle à manger."
|
||||
switch.turn_off,switch.grenier_lights,Interrupteur d'éclairage du grenier,switch.grenier_lights_main,"Éteins les lumières du grenier, s'il te plaît.","<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='switch.grenier_lights_main', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Très bien, je réessaie avec l'interrupteur d'éclairage du grenier."
|
||||
garage_door.toggle,garage_door.main_1,Porte de garage principale,garage_door.main_one,Bascule la porte de garage principale.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='garage_door.main_one', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","D'accord, je réessaye avec la porte de garage principale."
|
||||
switch.turn_off,switch.front_gate_lighting,Interrupteur des feux de porte avant,switch.front_gate_lightng,"Éteins les feux de la porte avant, s'il te plaît.","<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='switch.front_gate_lightng', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","D'accord, je réessaie avec l'interrupteur des feux de porte avant."
|
||||
light.toggle,light.en_bas_courtyard_mqtt,Lumière de la cour en bas,light.en_base_courtyard_mqtt,Bascule la lumière de la cour en bas.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='light.en_base_courtyard_mqtt', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","D'accord, j'essaie avec le bon appareil."
|
||||
blinds.stop_cover,blinds.salle_d'artisanat,Stores pour salle d'artisanat,blinds.salle_d'artisanat_extra,Arrête les stores de la salle d'artisanat.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='blinds.salle_d'artisanat_extra', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Très bien, je réessaie avec les stores pour la salle d'artisanat."
|
||||
|
124
data/piles/french/pile_of_refusals.csv
Normal file
124
data/piles/french/pile_of_refusals.csv
Normal file
@@ -0,0 +1,124 @@
|
||||
reason_type,service_name,device_name,friendly_name,desired_state,phrase,response
|
||||
not_available,lock.lock,back_door,Serrure de la porte arrière,,"Verrouille la <device_name>.","Je ne trouve pas de serrure de porte arrière à contrôler."
|
||||
already_state,light.turn_on,hallway,Lumières du couloir,on,"Allume les <device_name>.","Les lumières du couloir sont déjà allumées."
|
||||
already_state,switch.turn_off,garage,Prise du garage,off,"Éteins la <device_name>.","La prise du garage est déjà éteinte."
|
||||
not_available,light.turn_off,allée,Éclairage d'allée,,Éteins le <device_name>,"Désolé, je ne trouve pas le <device_name> dans la maison."
|
||||
already_state,blinds.close_cover,cuisine,Stores de cuisine,closed,Ferme le store <device_name>,"Le store <device_name> est déjà fermé, aucune action n’est nécessaire."
|
||||
not_available,garage_door.close_cover,une_voiture,Garage pour une voiture,,Ferme le <device_name>,"Désolé, je ne trouve pas le <device_name> dans votre maison."
|
||||
not_available,climate.turn_on,mysa_smart_thermostat,Thermostat intelligent Mysa pour plinthes électriques,,Allume le climat <device_name>,"Désolé, je ne trouve pas le dispositif <device_name> dans votre maison."
|
||||
already_state,blinds.open_cover,fenêtre_arrière,Stores de fenêtre arrière,open,Ouvre <device_name>,"Le volet est déjà ouvert, aucune action n'est nécessaire."
|
||||
not_available,climate.turn_on,bosch_bcc100,Commande connectée Bosch BCC100,,Allume le climat <device_name>.,"Désolé, je ne trouve pas le dispositif <device_name> dans la maison."
|
||||
already_state,climate.turn_off,sinope_smart,Thermostat intelligent Sinopé,off,Éteins le climat de <device_name>,"Le climat de <device_name> est déjà éteint, aucune action n'est nécessaire."
|
||||
not_available,fan.turn_off,étude_1,Fan d'étude,,Éteins le <device_name>,"Désolé, je ne trouve pas ce dispositif dans la maison."
|
||||
already_state,lock.unlock,fichier_cabinet,Serrure de classeur,unlocked,Déverrouille <device_name>,"Désolé, <device_name> est déjà déverrouillé, aucune action n’est nécessaire."
|
||||
not_available,climate.set_temperature,emerson_sensi_touch,Thermostat Wi-Fi Emerson Sensi Touch,,Régler la température du <device_name> à 18 degrés,"Désolé, je ne trouve pas le dispositif <device_name> dans la maison."
|
||||
already_state,climate.turn_off,mysa_smart_thermostat,Thermostat intelligent Mysa pour plinthes électriques,off,Éteins le climat de <device_name>,"Le climat de <device_name> est déjà éteint, aucune action n'est nécessaire."
|
||||
not_available,climate.set_temperature,transporteur_cor,Thermostat Wi-Fi Carrier Cor,,Régler la température du <device_name> à 23°C,"Désolé, je ne trouve pas le dispositif <device_name> dans la maison."
|
||||
not_available,light.turn_off,front_playroom_homekit,Éclairage avant de la salle de jeux,,Éteins <device_name>,"Désolé, je ne trouve pas <device_name> dans la maison."
|
||||
already_state,fan.turn_on,étude_2,Fan d'étude,on,Allume le ventilateur <device_name>,"Désolé, le ventilateur <device_name> est déjà allumé, aucune modification n’est nécessaire."
|
||||
not_available,media_player.volume_up,salle_de_jeu_console,Console de salle de jeux,,Augmente le volume de <device_name>,"Désolé, je ne trouve pas <device_name> dans votre domicile."
|
||||
not_available,vacuum.start,kitchen_xiaomi,Aspirateur de cuisine,,Démarre le <device_name>,"Désolé, je ne trouve pas le <device_name> dans la maison."
|
||||
not_available,media_player.media_play_pause,bose_living,Salon Bose,,Lecture/pause du média sur <device_name>,"Désolé, je ne trouve pas le dispositif <device_name> dans la maison."
|
||||
not_available,lock.lock,portail_électrique,Serrure de portail électrique,,Verrouille <device_name>,"Je suis désolé, je ne trouve pas cet appareil dans la maison."
|
||||
not_available,media_player.volume_down,ipad_cuisine,iPad de cuisine,,Baisser le volume du <device_name>,"Désolé, je ne trouve pas le <device_name> dans la maison."
|
||||
not_available,light.toggle,en_bas_fireplace_mqtt,Lumière de cheminée en bas,,Bascule <device_name>,"Désolé, je ne trouve pas cet appareil dans la maison."
|
||||
already_state,climate.turn_off,sinope_smart,Thermostat intelligent Sinopé,off,Éteins le climat de <device_name>,"Le climat de <device_name> est déjà éteint, aucune action n'est nécessaire."
|
||||
not_available,blinds.stop_cover,chambre_des_enfants,Stores pour chambres d'enfants,,Arrête le store <device_name>,"Désolé, je ne trouve pas le dispositif <device_name> dans votre maison."
|
||||
already_state,lock.unlock,porte_vélos,Antivol pour porte-vélos,unlocked,Déverrouille <device_name>,"Désolé, <device_name> est déjà déverrouillé, aucune action n'est nécessaire."
|
||||
already_state,lock.lock,porte_sur_le_toit,Serrure d'accès au toit,locked,Verrouiller <device_name>,"Le <device_name> est déjà verrouillé, aucune action n’est nécessaire."
|
||||
not_available,garage_door.open_cover,côté_2,Porte de garage latérale,,Ouvre le couvercle du <device_name>,"Désolé, je ne trouve pas ce dispositif dans votre maison."
|
||||
not_available,blinds.toggle,cuisine_fenêtre,Stores de fenêtre de cuisine,,Bascule <device_name>,"Désolé, je ne trouve pas <device_name> dans votre maison."
|
||||
not_available,fan.turn_on,salon_room_center,Ventilateur central du salon,,Allume le <device_name>,"Désolé, je ne trouve pas le <device_name> dans votre maison."
|
||||
already_state,switch.turn_on,water_feature_lights,Interrupteur d'éclairage de jeu d'eau,on,Allume <device_name>,"Le <device_name> est déjà allumé, aucune modification n'est nécessaire."
|
||||
not_available,climate.turn_off,mysa_smart_thermostat,Thermostat intelligent Mysa pour plinthes électriques,,Éteins le climat de <device_name>,"Désolé, je ne trouve pas cet appareil dans votre maison."
|
||||
already_state,vacuum.return_to_base,patio_doorway_vac,Nettoyant pour porte-patio,docked,Faire revenir <device_name> à la base,"Je suis désolé, <device_name> est déjà sur son socle, il n’y a rien à faire."
|
||||
already_state,blinds.close_cover,fenêtre_avant,Stores de fenêtre avant,closed,Fermer le volet <device_name>,"Le volet <device_name> est déjà fermé, aucune action n'est nécessaire."
|
||||
already_state,vacuum.return_to_base,ci_dessus_escaliers_robot,Appareil à épousseter au-dessus des escaliers,docked,Faire retourner <device_name> à sa base,"Le <device_name> est déjà sur son socle, aucun déplacement n’est nécessaire."
|
||||
not_available,switch.turn_off,salon_room_lights,Interrupteur d'éclairage du salon,,Éteins <device_name>,"Désolé, je ne trouve pas cet appareil dans la maison."
|
||||
already_state,media_player.media_play_pause,cuisine,Lecteur multimédia de cuisine,playing,Mettre en pause <device_name>,"Le lecteur <device_name> est déjà en lecture, aucune action n’est nécessaire."
|
||||
not_available,light.turn_on,à_l'étage_mancave_zigbee,Lumière de la grotte de l'homme à l'étage,,Allume la lumière <device_name> à 95% de luminosité,"Je suis désolé, je ne trouve pas cet appareil dans la maison."
|
||||
not_available,fan.decrease_speed,salle_de_bain_bas,Ventilateur dans la salle de bain du rez-de-chaussée,,Baisser la vitesse du <device_name>,"Désolé, je ne trouve pas le <device_name> dans votre maison."
|
||||
not_available,climate.turn_on,mysa_smart_thermostat,Thermostat intelligent Mysa pour plinthes électriques,,Allume le climat <device_name>,"Désolé, je ne trouve pas le dispositif <device_name> dans votre maison."
|
||||
not_available,media_player.media_play_pause,ps5_living_room,Salon PS5,,Mets en pause <device_name>,"Désolé, je ne trouve pas le dispositif <device_name> dans votre maison."
|
||||
not_available,blinds.open_cover,chambre_des_enfants,Stores pour chambres d'enfants,,Ouvre le volet <device_name>,"Désolé, je ne trouve pas ce dispositif dans la maison."
|
||||
not_available,media_player.volume_down,epson_home_cinema,Vidéoprojecteur Epson,,Baisse le volume de <device_name>,"Désolé, je ne trouve pas le dispositif <device_name> dans la maison."
|
||||
not_available,garage_door.open_cover,voiturette_de_golf,Garage pour voiturettes de golf,,Ouvre le couvercle du <device_name>,"Désolé, je ne trouve pas le <device_name> dans votre maison."
|
||||
not_available,media_player.turn_off,chromecast,Médias Chromecast,,Éteins le lecteur multimédia <device_name>,"Désolé, je ne trouve pas cet appareil dans la maison."
|
||||
not_available,blinds.open_cover,couloir,Stores de couloir,,Ouvre le volet <device_name>,"Je suis désolé, je ne trouve pas le dispositif <device_name> dans votre maison."
|
||||
already_state,media_player.turn_on,garderie,Lecteur multimédia pour crèche,on,Allume le lecteur multimédia <device_name>,"Le <device_name> est déjà allumé, aucune action n'est nécessaire."
|
||||
not_available,blinds.stop_cover,bureau,Stores de bureau,,Arrête le volet <device_name>,"Désolé, je ne trouve pas ce dispositif dans votre maison."
|
||||
already_state,fan.turn_on,cuisine_2,Ventilateurs de cuisine,on,Allume le ventilateur <device_name>,"Le ventilateur <device_name> est déjà allumé, aucune modification n'est requise."
|
||||
not_available,fan.toggle,salon_chambre_2,Ventilateur du salon,,Bascule <device_name>,"Désolé, je ne trouve pas ce dispositif dans la maison."
|
||||
not_available,blinds.stop_cover,couloir,Stores de couloir,,Arrête <device_name>,"Désolé, je ne trouve pas cet appareil dans votre maison."
|
||||
not_available,blinds.toggle,fenêtre_avant,Stores de fenêtre avant,,Bascule les <device_name>,"Désolé, je ne trouve pas <device_name> dans votre maison."
|
||||
already_state,light.turn_on,garderie,Lumière de pépinière,on,Allume la lumière <device_name>,"Désolé, <device_name> est déjà allumée, aucune action n'est nécessaire."
|
||||
not_available,media_player.turn_off,samsung_hw_q90r,Barre de son Surround Samsung,,Éteins le lecteur multimédia <device_name>,"Désolé, je ne trouve pas le dispositif <device_name> dans la maison."
|
||||
not_available,switch.turn_off,den_lights,Interrupteur de lumières de salon,,Éteins le <device_name>,"Désolé, je ne trouve pas ce dispositif dans la maison."
|
||||
not_available,garage_door.close_cover,camping_car,Porte de garage pour camping-car,,Ferme le couvercle du <device_name>,"Désolé, je ne trouve pas cet appareil dans votre maison."
|
||||
not_available,garage_door.stop_cover,deux_voitures,Garage pour deux voitures,,Arrête le <device_name>,"Désolé, je ne trouve pas le dispositif <device_name> dans votre maison."
|
||||
not_available,lock.lock,salle_de_sport,Serrure de salle de sport à domicile,,Verrouille le <device_name>,"Je suis désolé, mais je ne trouve pas le <device_name> dans la maison."
|
||||
not_available,light.turn_on,cuisine_winecellar_warm,Lumière chaude de cave à vin de cuisine,,"Allume la lumière <device_name> à 54 % de luminosité, couleur blanc froid.","Désolé, je ne trouve pas le dispositif <device_name> dans la maison."
|
||||
already_state,media_player.media_play_pause,roku_chambre,Joueur Roku dans la chambre,playing,Mettre en pause <device_name>,"Le lecteur <device_name> joue déjà, aucune modification n’est nécessaire."
|
||||
already_state,climate.turn_on,tado_smart,Thermostat intelligent Tado,on,Allume le climatiseur <device_name>,"Le <device_name> est déjà allumé, aucune action n'est nécessaire."
|
||||
not_available,light.turn_on,salle_à_manger_1,Lumière de la salle à manger,,Allume la lumière <device_name>,"Désolé, je ne trouve pas cet appareil dans la maison."
|
||||
not_available,light.toggle,étude,Étudier la lumière,,Bascule <device_name>,"Désolé, je ne trouve pas le dispositif <device_name> dans la maison."
|
||||
not_available,switch.toggle,utility_room_lights,Interrupteur d'éclairage de buanderie,,Bascule le <device_name>,"Désolé, je ne trouve pas ce dispositif dans votre maison."
|
||||
not_available,lock.unlock,porte_d'entrée,Serrure de porte avant,,Déverrouille <device_name>,"Désolé, je ne trouve pas cet appareil dans la maison."
|
||||
not_available,climate.turn_on,johnson_glas,Thermostat intelligent GLAS de Johnson Controls,,Allume le climat <device_name>,"Désolé, je ne trouve pas le dispositif <device_name> dans votre maison."
|
||||
already_state,lock.unlock,conservatoire,Verrouillage du conservatoire,unlocked,Déverrouille <device_name>,"Le verrou est déjà déverrouillé, aucune action n'est nécessaire."
|
||||
already_state,vacuum.return_to_base,front_hall_samsung,Robot de balayage du hall d'entrée,docked,Faire revenir <device_name> à la base,"Désolé, <device_name> est déjà docké, aucun besoin de le renvoyer."
|
||||
not_available,garage_door.open_cover,hangar_2,Deuxième porte du cabanon,,Ouvre le couvercle du <device_name>,"Désolé, je ne trouve pas le <device_name> dans votre maison."
|
||||
already_state,light.turn_off,front_lounge_ge,Éclairage du salon avant,off,Éteins <device_name>,"Le <device_name> est déjà éteint, aucune action n'est nécessaire."
|
||||
already_state,fan.turn_off,chambre_maître,Ventilateur de la chambre principale,off,Éteins le ventilateur <device_name>,"Le <device_name> est déjà éteint, aucune action n'est nécessaire."
|
||||
already_state,blinds.open_cover,salon_room_large,Stores du salon principal,open,Ouvre le volet <device_name>,"Le volet <device_name> est déjà ouvert, aucune action n'est nécessaire."
|
||||
not_available,vacuum.stop,salon_room_roomba,Aspirateur de salon,,Arrête le <device_name>,"Désolé, je ne trouve pas cet appareil dans la maison."
|
||||
not_available,media_player.turn_on,denon_av_receiver,Récepteur audio-vidéo Denon,,Allume le lecteur multimédia <device_name>,"Désolé, je ne trouve pas le dispositif <device_name> dans votre maison."
|
||||
already_state,blinds.open_cover,bureau_fenêtre,Stores de fenêtre de bureau,open,ouvre <device_name>,"Le <device_name> est déjà ouvert, aucune action nécessaire."
|
||||
not_available,switch.turn_off,sous_cabinet_lights,Interrupteur d'éclairage sous l'armoire,,Éteins <device_name>,"Désolé, je ne trouve pas cet appareil dans votre maison."
|
||||
not_available,garage_door.toggle,bateau,Porte de rangement pour bateau,,Bascule le <device_name>.,"Désolé, je ne trouve pas ce dispositif dans la maison."
|
||||
already_state,fan.turn_off,chambre_droite,Ventilateur de chambre côté droit,off,Éteins le ventilateur <device_name>,"Le ventilateur <device_name> est déjà éteint, aucune action n'est nécessaire."
|
||||
not_available,media_player.turn_on,google_nest_hub,Écran intelligent de l'Assistant Google,,Allume le lecteur multimédia <device_name>.,"Je suis désolé, je ne trouve pas le dispositif <device_name> dans votre maison."
|
||||
not_available,media_player.volume_down,nintendo_switch,Nintendo Switch,,baisser le volume de <device_name>,"Je suis désolé, je ne trouve pas le dispositif <device_name> dans la maison."
|
||||
not_available,switch.toggle,feux_de_cour_arriere,Interrupteur des feux de cour arrière,,Bascule le commutateur <device_name>,"Désolé, je ne trouve pas <device_name> dans votre maison."
|
||||
not_available,fan.decrease_speed,balcon,Ventilateur de balcon,,Baisse la vitesse du <device_name>,"Désolé, je ne trouve pas le <device_name> dans la maison."
|
||||
not_available,blinds.toggle,garage,Stores de garage,,Bascule les <device_name>,"Désolé, je ne trouve pas les <device_name> dans votre maison."
|
||||
already_state,switch.turn_off,garage_atelier_lights,Interrupteur d'éclairage d'atelier de garage,off,Éteins le <device_name>,"Le <device_name> est déjà éteint, aucune action n'est nécessaire."
|
||||
not_available,climate.set_temperature,kono_thermostat,Thermostat intelligent Kono,,Régler la température du <device_name> à 22°C,"Désolé, je ne trouve pas le dispositif <device_name> dans votre maison."
|
||||
already_state,vacuum.return_to_base,left_corner_bot,Aspirateur de saleté du coin gauche,docked,Faire revenir <device_name> à la base,"Le <device_name> est déjà docké, aucune action n'est nécessaire."
|
||||
not_available,climate.turn_on,netatmo_smart,Thermostat Intelligent Netatmo,,Allume le climat <device_name>,"Désolé, je ne trouve pas cet appareil dans la maison."
|
||||
not_available,blinds.open_cover,bureau_fenêtre,Stores de fenêtre de bureau,,Ouvre le volet <device_name>,"Désolé, je ne trouve pas le dispositif <device_name> dans votre maison."
|
||||
not_available,fan.toggle,chambre_maître,Ventilateur de la chambre principale,,Bascule le ventilateur <device_name>,"Désolé, je ne trouve pas ce dispositif dans la maison."
|
||||
not_available,fan.turn_off,salle_à_manger,Ventilateur de salle à manger,,Éteins le <device_name>,"Désolé, je ne trouve pas ce ventilateur dans la maison."
|
||||
not_available,blinds.open_cover,salle_d'artisanat,Stores pour salle d'artisanat,,Ouvre le volet <device_name>,"Désolé, je ne trouve pas le dispositif <device_name> dans la maison."
|
||||
not_available,fan.decrease_speed,grenier_ventilation,Ventilateur de grenier,,Baisse la vitesse du <device_name>,"Je suis désolé, je ne trouve pas le <device_name> dans votre maison."
|
||||
not_available,switch.toggle,couloir_lights,Interrupteur d'éclairage de couloir,,Bascule <device_name>,"Je suis désolé, mais je ne trouve pas cet appareil dans votre maison."
|
||||
already_state,fan.turn_off,îlot_cuisine,Ventilateur de cuisine,off,Éteins le ventilateur <device_name>,"Désolé, le ventilateur <device_name> est déjà éteint, aucune action n'est nécessaire."
|
||||
not_available,switch.toggle,feux_de_cour_arriere,Interrupteur des feux de cour arrière,,Bascule <device_name>,"Désolé, je ne trouve pas <device_name> dans la maison."
|
||||
not_available,media_player.turn_on,salle_de_bains_speaker_system,Haut-parleur de salle de bain étanche,,Allume le <device_name>,"Désolé, je ne trouve pas ce dispositif dans la maison."
|
||||
not_available,fan.decrease_speed,grenier_3,Ventilateurs de grenier,,Baisser la vitesse du <device_name>,"Désolé, je ne trouve pas le <device_name> dans la maison."
|
||||
not_available,climate.turn_on,sinope_smart,Thermostat intelligent Sinopé,,Allume le climat <device_name>,"Désolé, je ne trouve pas le dispositif <device_name> dans votre maison."
|
||||
not_available,vacuum.start,salle_à_manger_area_bissel,Détachant la saleté de la salle à manger,,Démarre le <device_name>,"Je suis désolé, je ne trouve pas le <device_name> dans la maison."
|
||||
not_available,vacuum.return_to_base,kitchen_xiaomi,Aspirateur de cuisine,,Faire revenir <device_name> à sa base,"Désolé, je ne trouve pas <device_name> dans la maison."
|
||||
already_state,lock.unlock,grenier,Serrure de porte de grenier,unlocked,déverrouille <device_name>,"Le <device_name> est déjà déverrouillé, aucune action n'est nécessaire."
|
||||
not_available,vacuum.start,maître_chambre_requin,Aspirateur de la chambre principale,,Démarre le <device_name>,"Désolé, je ne trouve pas cet appareil chez vous."
|
||||
already_state,climate.turn_on,bosch_bcc100,Commande connectée Bosch BCC100,on,Allume le climat <device_name>,"Le <device_name> est déjà allumé, aucune action n'est nécessaire."
|
||||
not_available,media_player.turn_off,salle_de_bains_speaker_system,Haut-parleur de salle de bain étanche,,Éteins le lecteur multimédia <device_name>,"Désolé, je ne trouve pas le dispositif <device_name> dans la maison."
|
||||
not_available,light.turn_off,arrière_cour,Lumière de jardin,,Éteins <device_name>,"Désolé, je ne trouve pas <device_name> dans la maison."
|
||||
already_state,blinds.open_cover,garage,Stores de garage,open,Ouvre le volet <device_name>,"Le volet <device_name> est déjà ouvert, aucune action n'est nécessaire."
|
||||
not_available,switch.turn_off,den_lights,Interrupteur de lumières de salon,,Éteins le <device_name>,"Désolé, je ne trouve pas le <device_name> dans la maison."
|
||||
not_available,light.turn_on,retour_attic_lifx,Lumière de grenier arrière,,Allume <device_name>,"Désolé, je ne trouve pas le dispositif <device_name> dans la maison."
|
||||
already_state,fan.turn_off,le_porche,Ventilateur de porche,off,Éteins le <device_name>,"Le <device_name> est déjà éteint, aucune action n'est nécessaire."
|
||||
not_available,media_player.turn_on,sonos_cuisine,Cuisine Sonos,,Allume le lecteur multimédia <device_name>,"Désolé, je ne trouve pas le dispositif <device_name> dans votre maison."
|
||||
not_available,climate.turn_on,nest_learning,Thermostat d'apprentissage Nest,,Allume le climat <device_name>,"Désolé, je ne trouve pas le dispositif <device_name> dans la maison."
|
||||
already_state,lock.unlock,yale_cuisine,Cuisine Yale,unlocked,déverrouille <device_name>,"Désolé, <device_name> est déjà déverrouillé, aucune action n'est nécessaire."
|
||||
not_available,fan.turn_on,salon,Ventilateur de salon,,Allume le <device_name>,"Désolé, je ne trouve pas le <device_name> dans la maison."
|
||||
not_available,switch.turn_off,lumières_porche,Interrupteur de lumières de porche,,Éteins le <device_name>.,"Désolé, je ne trouve pas le <device_name> dans votre maison."
|
||||
not_available,light.turn_on,downstairs_master_chambre_homekit,Lumière de la chambre principale en bas,,Allume la lumière <device_name> en jaune,"Désolé, je ne trouve pas ce dispositif dans la maison."
|
||||
already_state,blinds.close_cover,ikea_smart,Stores intelligents Ikea,closed,Fermez <device_name>,"Désolé, <device_name> est déjà fermé, aucune action n'est nécessaire."
|
||||
already_state,lock.unlock,allée_gate,Serrure de portail d'allée,unlocked,Déverrouille <device_name>,"Désolé, <device_name> est déjà déverrouillé, aucune action n'est nécessaire."
|
||||
not_available,garage_door.toggle,côté,Porte de garage latérale,,Bascule le <device_name>,"Désolé, je ne trouve pas ce dispositif dans la maison."
|
||||
already_state,light.turn_off,back_office_lifx,Éclairage du back-office,off,Éteins la lumière <device_name>,"La lumière <device_name> est déjà éteinte, aucune action n'est nécessaire."
|
||||
already_state,fan.turn_off,garderie,Ventilateur de chambre d'enfant,off,Éteins le ventilateur <device_name>,"Désolé, le ventilateur <device_name> est déjà éteint, aucune action n’est nécessaire."
|
||||
not_available,blinds.stop_cover,salle_de_bain,Stores de salle de bain,,Arrête <device_name>,"Désolé, je ne trouve pas le dispositif <device_name> dans votre maison."
|
||||
not_available,fan.increase_speed,chambre_invité,Ventilateur de chambre d'amis,,Augmente la vitesse du <device_name>,"Désolé, je ne trouve pas le <device_name> dans la maison."
|
||||
already_state,fan.turn_on,balcon,Ventilateur de balcon,on,Allume le ventilateur <device_name>,"Le ventilateur est déjà allumé, aucune action n'est nécessaire."
|
||||
|
File diff suppressed because it is too large
Load Diff
124
data/piles/german/pile_of_failed_tool_calls.csv
Normal file
124
data/piles/german/pile_of_failed_tool_calls.csv
Normal file
@@ -0,0 +1,124 @@
|
||||
service_name,correct_device_name,correct_friendly_name,bad_device_name,phrase,error_result,retry_prompt
|
||||
light.turn_on,light.living_room_lamp,Wohnzimmerlampe,light.livng_room_lamp,"Bitte schalte die <device_name> ein.","Fehler: Entität light.livng_room_lamp nicht gefunden.","Ich versuche stattdessen die Wohnzimmerlampe."
|
||||
climate.set_temperature,climate.hallway,Flurthermostat,climate.halway,"Stelle den <device_name> auf <temp_f> Grad ein.","Fehler: Entität climate.halway nicht gefunden.","Versuche es erneut mit dem Flurthermostat."
|
||||
fan.turn_off,fan.office,Büroventilator,fan.offce,"Schalte den <device_name> aus.","Fehler: Entität fan.offce nicht gefunden.","Ich versuche den Büroventilator erneut."
|
||||
media_player.turn_on,media_player.bose_living,Bose-Wohnzimmer,media_player.bose_livingroom,Schalte bitte die Bose‑Wohnzimmer‑Anlage ein.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='media_player.bose_livingroom', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Alles klar, ich versuche es jetzt mit dem richtigen Gerät."
|
||||
garage_door.stop_cover,garage_door.carport,Carport-Garagentor,garage_door.carportt,Stoppe das Carport-Garagentor.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='garage_door.carportt', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Okay, ich versuche es mit dem richtigen Gerät."
|
||||
vacuum.return_to_base,vacuum.entryway_eufy,Staubsammler im Eingangsbereich,vacuum.entryway_euffy,Kannst du bitte den Staubsammler im Eingangsbereich zurück zur Basis fahren?,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='vacuum.entryway_euffy', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Okay, ich probiere es jetzt mit dem richtigen Gerät."
|
||||
garage_door.toggle,garage_door.golfwagen,Golfwagentür,garage_door.golfwage,Bitte öffne die Garage.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='garage_door.golfwage', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Alles klar, ich versuche es jetzt mit der Golfwagentür."
|
||||
switch.turn_on,switch.study_room_lights,Lichtschalter im Arbeitszimmer,switch.studyroom_lights,Schalte bitte das Licht im Arbeitszimmer ein.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='switch.studyroom_lights', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Okay, ich versuche es jetzt mit dem richtigen Gerät: Lichtschalter im Arbeitszimmer."
|
||||
light.toggle,light.badezimmerspiegel,Spiegellichter,light.badezimmerspiegel_alt,Schalte die Spiegellichter bitte um.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='light.badezimmerspiegel_alt', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Entschuldigung, ich versuche es jetzt mit dem richtigen Gerät."
|
||||
light.turn_off,light.downstairs_fireplace_mqtt,Kaminlicht im Erdgeschoss,light.downstairs_fireplace_mqtt_backup,Schalte das Kaminlicht im Erdgeschoss aus.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='light.downstairs_fireplace_mqtt_backup', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Entschuldigung, ich probiere es jetzt mit dem korrekten Gerät."
|
||||
lock.unlock,lock.wintergarten,Wintergartenschloss,lock.wintergaten,Entsperre bitte das Wintergartenschloss.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='lock.wintergaten', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>",Versuche es jetzt mit dem richtigen Gerät lock.wintergarten.
|
||||
light.turn_off,light.upstairs_fireplace_zwave,Kaminlicht im Obergeschoss,light.upstairs_fireplace_z,Schalte das Kaminlicht im Obergeschoss aus.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='light.upstairs_fireplace_z', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Alles klar, ich versuche es jetzt mit dem korrekten Gerät."
|
||||
climate.turn_on,climate.emerson_sensi_touch,Emerson Sensi Touch WLAN-Thermostat,climate.emerson_sensi_touch_plus,Bitte das Thermostat einschalten.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='climate.emerson_sensi_touch_plus', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Okay, ich versuche es erneut mit dem richtigen Gerät."
|
||||
vacuum.return_to_base,vacuum.downstairs_guest_room,Staubsauger im Gästezimmer im Erdgeschoss,vacuum.guestroom_downstairs,Kannst du den Staubsauger im Gästezimmer im Erdgeschoss zur Ladestation zurückfahren?,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='vacuum.guestroom_downstairs', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Verstanden, ich versuche es jetzt mit dem Gerät 'vacuum.downstairs_guest_room'."
|
||||
switch.turn_off,switch.spielzimmer_lichter,Lichtschalter für Spielzimmer,switch.spielzimmer_lichtern,Schalte bitte das Licht im Spielzimmer aus.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='switch.spielzimmer_lichtern', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Entschuldigung, ich versuche es jetzt mit dem richtigen Schalter."
|
||||
climate.set_temperature,climate.trane_comfortlink_ii,Trane ComfortLink II XL1050,climate.trane_comfortlink_ii_extra,Bitte stelle die Temperatur auf <temp_f> Grad ein.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='climate.trane_comfortlink_ii_extra', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Alles klar, ich probiere es mit dem richtigen Gerät."
|
||||
light.toggle,light.downstairs_mancave_homekit,Menschenhöhlenlicht im Erdgeschoss,light.downstairs_mancave_homekit_v2,Schalte das Menschenhöhlenlicht im Erdgeschoss ein.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='light.downstairs_mancave_homekit_v2', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Verstanden, ich probiere jetzt das Menschenhöhlenlicht im Erdgeschoss."
|
||||
media_player.volume_down,media_player.playstation_5,Sony PS5,media_player.playstation_5x,"Hey, kannst du die Lautstärke meiner Sony PS5 leiser machen?","<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='media_player.playstation_5x', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Okay, ich versuche es mit dem richtigen Gerät."
|
||||
light.turn_on,light.front_library_ge,Vordere Bibliotheksleuchte,light.front_librar_ge,Schalte bitte das Licht in der vorderen Bibliothek ein.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='light.front_librar_ge', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>",Versuche es jetzt mit der Vordere Bibliotheksleuchte.
|
||||
media_player.turn_on,media_player.roku_schlafzimmer,Roku-Hauptschlafzimmer,media_player.roku_schlafzimmer_alt,Bitte schalte das Roku im Hauptschlafzimmer ein.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='media_player.roku_schlafzimmer_alt', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Verstanden, ich versuche es jetzt mit dem richtigen Gerät."
|
||||
fan.turn_off,fan.küche,Küchenventilator,fan.küchevent,Schalte den Küchenventilator aus.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='fan.küchevent', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Okay, ich versuche es jetzt mit dem Küchenventilator."
|
||||
vacuum.start,vacuum.front_hall_samsung,Kehrender Bot in der Eingangshalle,vacuum.front_hall_samsungs,Bitte starte den Kehrenden Bot in der Eingangshalle.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='vacuum.front_hall_samsungs', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Verstanden, ich versuche es jetzt mit dem richtigen Gerät."
|
||||
blinds.open_cover,blinds.flur,Flurjalousien,blinds.flur_jalousien,Öffne die Jalousien im Flur.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='blinds.flur_jalousien', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Okay, ich versuche es mit den Flurjalousien."
|
||||
light.toggle,light.downstairs_arcade_homekit,Arcade-Licht im Erdgeschoss,light.downstairs_arcade_homekit_v2,Schalte das Arcade-Licht im Erdgeschoss bitte um.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='light.downstairs_arcade_homekit_v2', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Alles klar, ich versuche es jetzt mit dem korrekten Gerät."
|
||||
blinds.open_cover,blinds.gäste_wc,Jalousien für das Gästebad,blinds.wc_gäste,Öffne die Jalousien im Gäste‑WC.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='blinds.wc_gäste', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Okay, ich versuche es jetzt mit den Jalousien für das Gästebad."
|
||||
switch.toggle,switch.sicherheitssystem,Schalter des Sicherheitssystems,switch.sicherheitssysteme,Schalte bitte den Schalter des Sicherheitssystems um.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='switch.sicherheitssysteme', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Alles klar, ich probiere es mit dem korrekten Gerät."
|
||||
climate.turn_on,climate.trane_comfortlink_ii,Trane ComfortLink II XL1050,climate.trane_comfortlink_iii,Schalte bitte die Klimaanlage ein.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='climate.trane_comfortlink_iii', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Alles klar, ich probiere es jetzt mit dem richtigen Gerät."
|
||||
fan.toggle,fan.terrasse,Terrassenventilator,fan.terrassenz,Schalte den Terrassenventilator bitte ein.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='fan.terrassenz', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Alles klar, ich probiere es jetzt mit dem Terrassenventilator."
|
||||
lock.lock,lock.werkzeugschuppen,Schloss für Geräteschuppen,lock.werkzeugschupen,Bitte schließe das Schloss für den Geräteschuppen.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='lock.werkzeugschupen', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Verstanden, ich probiere es jetzt mit lock.werkzeugschuppen."
|
||||
lock.unlock,lock.pool_gate,Pooltorschloss,lock.pool_gate_main,Bitte entsperre das Pooltorschloss.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='lock.pool_gate_main', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Okay, ich versuche es jetzt mit dem richtigen Gerät lock.pool_gate."
|
||||
media_player.media_play_pause,media_player.denon_av_receiver,Denon Audio-Video-Receiver,media_player.denon_av_rec,Bitte spiele oder pausiere die Musik auf dem Receiver,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='media_player.denon_av_rec', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Okay, ich versuche es jetzt mit dem richtigen Gerät."
|
||||
fan.turn_on,fan.schlafzimmer,Schlafzimmerventilator,fan.schlummerzimmer,Bitte schalte den Ventilator im Schlafzimmer ein.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='fan.schlummerzimmer', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Entschuldigung, ich versuche es mit dem Schlafzimmerventilator."
|
||||
switch.turn_off,switch.outdoor_security_lights,Schalter für Sicherheitsbeleuchtung im Außenbereich,switch.outdoor_security_light,Bitte schalte die Sicherheitsbeleuchtung im Außenbereich aus.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='switch.outdoor_security_light', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Entschuldigung, ich versuche es jetzt mit dem korrekten Schalter."
|
||||
vacuum.return_to_base,vacuum.smart_home_automator,Smart-Home-Reinigungsbot,vacuum.smart_home_automat,Bitte bringe den Staubsauger zurück zur Ladestation.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='vacuum.smart_home_automat', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Entschuldigung, ich versuche es jetzt mit dem richtigen Gerät."
|
||||
fan.turn_on,fan.schlafzimmer,Schlafzimmerventilator,fan.schlafzimmer_extra,Schalte den Schlafzimmerventilator bitte ein.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='fan.schlafzimmer_extra', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Okay, ich versuche es jetzt mit dem Schlafzimmerventilator."
|
||||
light.turn_on,light.upstairs_study_zwave,Arbeitszimmerlampe im Obergeschoss,light.upstairs_stud_zwave,Schalte bitte das Licht im Arbeitszimmer ein.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='light.upstairs_stud_zwave', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Alles klar, ich versuche es jetzt mit der Arbeitszimmerlampe im Obergeschoss."
|
||||
climate.set_temperature,climate.bosch_bcc100,Bosch BCC100 Connected Control,climate.bosch_ccb100,Stelle die Temperatur auf <temp_f> Grad ein.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='climate.bosch_ccb100', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Okay, ich versuche es jetzt mit dem richtigen Gerät."
|
||||
light.toggle,light.front_study_homekit,Vorderes Studienlicht,light.front_study_homekit_v2,Schalte das Vorderes Studienlicht um.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='light.front_study_homekit_v2', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Okay, ich versuche es mit dem Vorderen Studienlicht."
|
||||
fan.turn_on,fan.wohnzimmer_mitte,Zentraler Wohnzimmerventilator,fan.wohnzimmer_mitte_alt,Kannst du bitte den zentralen Wohnzimmerventilator einschalten?,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='fan.wohnzimmer_mitte_alt', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Okay, ich versuche es jetzt mit dem richtigen Gerät."
|
||||
climate.set_temperature,climate.emerson_sensi_touch,Emerson Sensi Touch WLAN-Thermostat,climate.emer_sensi_touch,Stelle die Temperatur auf <temp_f> Grad ein.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='climate.emer_sensi_touch', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Alles klar, ich versuche es jetzt mit dem Emerson Sensi Touch WLAN‑Thermostat."
|
||||
blinds.close_cover,blinds.somfy_living,Wohnzimmerjalousien,blinds.somfy_livng,Schließe bitte die Wohnzimmerjalousien.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='blinds.somfy_livng', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Okay, ich versuche es mit dem richtigen Gerät."
|
||||
fan.decrease_speed,fan.esszimmer,Esszimmerventilator,fan.esszimmervent,Kannst du bitte die Geschwindigkeit des Esszimmerventilators reduzieren?,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='fan.esszimmervent', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Okay, ich probiere es jetzt mit dem richtigen Gerät."
|
||||
fan.turn_on,fan.badezimmer,Badezimmerventilator,fan.badezimm,Bitte schalte den Badezimmerventilator ein.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='fan.badezimm', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Alles klar, ich versuche es jetzt mit dem Badezimmerventilator."
|
||||
light.turn_on,light.downstairs_office_mqtt,Bürolicht im Erdgeschoss,light.downstairs_offic_mqtt,Schalte das Bürolicht im Erdgeschoss ein.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='light.downstairs_offic_mqtt', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Okay, ich probiere es mit dem richtigen Gerät erneut."
|
||||
climate.turn_on,climate.carrier_cor,Carrier Cor WLAN-Thermostat,climate.carrier_core,Bitte das Klima im Wohnzimmer einschalten.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='climate.carrier_core', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>",Versuche es jetzt mit dem korrekten Gerät climate.carrier_cor.
|
||||
media_player.media_play_pause,media_player.roku_schlafzimmer,Schlafzimmer-Roku-Spieler,media_player.roku_zimmer_schlaf,Spiele das Video auf dem Schlafzimmer-Roku-Spieler ab.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='media_player.roku_zimmer_schlaf', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Alles klar, ich versuche es jetzt mit dem richtigen Gerät."
|
||||
media_player.turn_off,media_player.chrome_cast_schlafzimmer,Schlafzimmer-Chromecast,media_player.chromecast_schlafzimmer,Schalte das Schlafzimmer-Chromecast aus.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='media_player.chromecast_schlafzimmer', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Okay, ich versuche es jetzt mit dem richtigen Gerät."
|
||||
garage_door.toggle,garage_door.weinkeller,Weinkellertür,garage_door.weinkeller_tür,Öffne die Weinkellertür.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='garage_door.weinkeller_tür', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Okay, ich versuche es jetzt mit der richtigen Weinkellertür."
|
||||
light.turn_on,light.garage,Garagenlicht,light.garagel,Schalte das Garagenlicht ein.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='light.garagel', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Okay, ich versuche es mit dem Garagenlicht."
|
||||
media_player.volume_up,media_player.kindergarten,Kindergarten-Mediaplayer,media_player.kindergartn,Bitte die Lautstärke beim Kindergarten-Mediaplayer erhöhen.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='media_player.kindergartn', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Okay, ich versuche es jetzt mit dem Kindergarten-Mediaplayer."
|
||||
switch.toggle,switch.outdoor_security_lights,Schalter für Sicherheitsbeleuchtung im Außenbereich,switch.outdoor_security_light,Schalte bitte die Sicherheitsbeleuchtung im Außenbereich ein.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='switch.outdoor_security_light', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Verstanden, ich probiere es jetzt mit dem korrekten Schalter."
|
||||
switch.turn_off,switch.study_room_lights,Lichtschalter im Arbeitszimmer,switch.studyroom_lights,Schalte bitte das Licht im Arbeitszimmer aus.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='switch.studyroom_lights', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Entschuldigung, ich versuche es erneut mit dem richtigen Gerät."
|
||||
light.turn_on,light.kitchen_island_cool,Kühles Licht der Kücheninsel,light.kitchen_island_cooler,Schalte das kühle Licht der Kücheninsel ein.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='light.kitchen_island_cooler', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Entschuldigung, ich versuche es jetzt mit dem richtigen Gerät."
|
||||
blinds.close_cover,blinds.küche,Küchenjalousien,blinds.küche_alt,Schließe bitte die Jalousien in der Küche.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='blinds.küche_alt', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>",Ich versuche es noch einmal mit den Küchenjalousien.
|
||||
media_player.turn_on,media_player.echo_dot,Küche Echo Dot,media_player.echodot_kueche,Bitte schalte die Küche Echo Dot ein.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='media_player.echodot_kueche', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Kein Problem, ich probiere es jetzt mit dem richtigen Gerät."
|
||||
switch.turn_off,switch.gartenlichter,Steuerung der Gartenbeleuchtung,switch.gartenlicht,Schalte bitte die Gartenbeleuchtung aus.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='switch.gartenlicht', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Okay, ich versuche es jetzt mit switch.gartenlichter."
|
||||
vacuum.return_to_base,vacuum.downstairs_guest_room,Staubsauger im Gästezimmer im Erdgeschoss,vacuum.downstairs_gestru_rm,Bitte bring den Staubsauger im Gästezimmer im Erdgeschoss zurück zur Basis.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='vacuum.downstairs_gestru_rm', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Verstanden, ich versuche es jetzt mit dem korrekten Gerät."
|
||||
blinds.open_cover,blinds.dachfenster,Oberlichtjalousien,blinds.dachfenster_alt,Öffne die Oberlichtjalousien.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='blinds.dachfenster_alt', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Entschuldigung, ich versuche es jetzt mit den Oberlichtjalousien."
|
||||
switch.turn_on,switch.warehouse_lights,Lagerlichtschalter,switch.warehous_lights,Bitte das Lagerlicht einschalten.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='switch.warehous_lights', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>",Ich versuche es jetzt mit dem richtigen Gerät.
|
||||
climate.turn_off,climate.johnson_glas,Johnson Controls GLAS Smart Thermostat,climate.johns_glass,Schalte die Klimaanlage aus.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='climate.johns_glass', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Okay, ich versuche es mit dem richtigen Gerät."
|
||||
climate.turn_off,climate.honeywell_lyric_t6,Honeywell Lyric T6 Pro,climate.honeywell_lyric_t6x,Kannst du bitte das Klima im Wohnzimmer ausschalten?,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='climate.honeywell_lyric_t6x', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Alles klar, ich versuche es jetzt mit dem richtigen Gerät."
|
||||
lock.lock,lock.garage,Garagentorschloss,lock.garage_main,Bitte schließe das Garagentorschloss.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='lock.garage_main', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Verstanden, ich verwende jetzt das korrekte Gerät lock.garage."
|
||||
garage_door.stop_cover,garage_door.two_car,Garage für zwei Autos,garage_door.two_car_plus,Stopp die Garage für zwei Autos.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='garage_door.two_car_plus', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Verstanden, ich benutze jetzt das richtige Gerät."
|
||||
garage_door.close_cover,garage_door.ein_auto,Garage für ein Auto,garage_door.ein_auto_alt,Bitte das Garagentor für ein Auto schließen.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='garage_door.ein_auto_alt', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Okay, ich versuche es nochmal mit dem richtigen Gerät."
|
||||
fan.turn_on,fan.wäschekammer,Ventilator für die Waschküche,fan.wäschekammer_2,Schalte bitte den Ventilator für die Waschküche ein.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='fan.wäschekammer_2', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Entschuldigung, ich versuche es mit dem richtigen Gerät."
|
||||
climate.turn_off,climate.sinope_smart,Intelligentes Thermostat von Sinopé,climate.smart_sinope,Bitte das Thermostat ausschalten.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='climate.smart_sinope', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Alles klar, ich versuche es jetzt mit dem Intelligenten Thermostat von Sinopé."
|
||||
garage_door.close_cover,garage_door.rv_storage,Stauraumtür für Wohnmobile,garage_door.rv_storag,Schließe bitte die Stauraumtür für Wohnmobile.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='garage_door.rv_storag', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Alles klar, ich probiere es jetzt mit der Stauraumtür für Wohnmobile."
|
||||
light.turn_on,light.downstairs_tv_room_homekit,TV-Raumbeleuchtung im Erdgeschoss,light.downstairs_tv_room_homekit_v2,Bitte das Licht im TV‑Raum im Erdgeschoss einschalten.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='light.downstairs_tv_room_homekit_v2', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Okay, ich versuche es mit dem richtigen Gerät 'light.downstairs_tv_room_homekit'."
|
||||
media_player.turn_on,media_player.onkyo_tx_sr,Onkyo Heimkino-Receiver,media_player.onkyo_tx_srx,Schalte den Onkyo Heimkino-Receiver ein.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='media_player.onkyo_tx_srx', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>",Versuche es jetzt mit dem korrekten Gerät.
|
||||
lock.unlock,lock.sauna,Sauna-Türschloss,lock.saunax,Bitte das Saunatürschloss öffnen.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='lock.saunax', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Okay, ich versuche es jetzt mit dem richtigen Gerät."
|
||||
lock.lock,lock.elektrisches_tor,Elektrisches Torschloss,lock.elektrisches_torx,Bitte schließe das elektrische Torschloss.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='lock.elektrisches_torx', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Alles klar, ich versuche es jetzt mit dem richtigen Gerät."
|
||||
blinds.stop_cover,blinds.kitchen_window,Jalousien für Küchenfenster,blinds.kitchen_win,Stoppe bitte die Jalousien im Küchenfenster.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='blinds.kitchen_win', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Alles klar, ich versuche es jetzt mit den Jalousien für das Küchenfenster."
|
||||
garage_door.open_cover,garage_door.geschäft,Werkstatt Garagentor,garage_door.gesch,Öffne das Garagentor der Werkstatt.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='garage_door.gesch', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Verstanden, ich versuche es jetzt mit dem richtigen Gerät."
|
||||
fan.turn_off,fan.dachbodenlüftung,Ventilator für Dachbodenlüftung,fan.dachboden_lüftung,Schalte den Ventilator für die Dachbodenlüftung aus.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='fan.dachboden_lüftung', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Kein Problem, ich versuche es jetzt mit dem Ventilator für Dachbodenlüftung."
|
||||
switch.turn_on,switch.sicherheitssystem,Schalter des Sicherheitssystems,switch.sicherheits_modul,Bitte schalte das Sicherheitssystem ein.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='switch.sicherheits_modul', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Entschuldigung, ich versuche es jetzt mit dem Schalter des Sicherheitssystems."
|
||||
lock.lock,lock.ski_storage,Skiaufbewahrungsschloss,lock.ski_store,Bitte verriegle das Skiaufbewahrungsschloss.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='lock.ski_store', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Verstanden, ich versuche es jetzt mit dem richtigen Gerät."
|
||||
fan.decrease_speed,fan.wohnzimmer_1,Wohnzimmerventilator,fan.wohnzimmer_1x,Bitte reduziere die Geschwindigkeit des Wohnzimmerventilators.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='fan.wohnzimmer_1x', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Entschuldigung, ich probiere es jetzt mit dem korrekten Gerät fan.wohnzimmer_1."
|
||||
switch.turn_on,switch.attic_lights,Lichtschalter für den Dachboden,switch.attic_lights_main,Schalte das Licht im Dachboden ein.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='switch.attic_lights_main', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Okay, ich versuche es jetzt mit dem richtigen Gerät 'switch.attic_lights'."
|
||||
blinds.close_cover,blinds.esszimmer,Esszimmerjalousien,blinds.esszimm,Schließe bitte die Jalousien im Esszimmer.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='blinds.esszimm', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Okay, ich versuche es mit den Esszimmerjalousien."
|
||||
lock.unlock,lock.gun_safe,Waffentresorschloss,lock.gun_saf,Entsperre bitte das Waffentresorschloss.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='lock.gun_saf', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Okay, ich versuche es jetzt mit dem korrekten Gerät (lock.gun_safe)."
|
||||
light.turn_off,light.kitchen_microwave_warm,"Küche, Mikrowelle, warmes Licht",light.kitchen_microwav_warm,"Schalte das warme Licht in der Küche aus, das über der Mikrowelle ist.","<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='light.kitchen_microwav_warm', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Alles klar, ich versuche es jetzt mit dem richtigen Gerät."
|
||||
climate.set_temperature,climate.emerson_sensi_touch,Emerson Sensi Touch WLAN-Thermostat,climate.emer_sensi_touch,Stelle die Temperatur auf <temp_f> Grad ein.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='climate.emer_sensi_touch', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Okay, ich versuche es mit dem Emerson Sensi Touch Thermostat."
|
||||
blinds.toggle,blinds.somfy_kitchen,Küchenjalousien,blinds.kitchen_somfy,Schalte die Küchenjalousien um.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='blinds.kitchen_somfy', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Okay, ich versuche es jetzt mit den Küchenjalousien."
|
||||
light.turn_off,light.upstairs_recreation_zigbee,Erholungslicht im Obergeschoss,light.upstairs_recreat_zigbee,Schalte das Erholungslicht im Obergeschoss aus.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='light.upstairs_recreat_zigbee', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Verstanden, ich versuche es jetzt mit dem richtigen Gerät."
|
||||
switch.toggle,switch.zoo_enclosure_lighting,Steuerung der Zoogehegebeleuchtung,switch.zoo_enclosure_lights,Schalte die Zoogehegebeleuchtung ein.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='switch.zoo_enclosure_lights', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Okay, ich versuche es mit der Steuerung der Zoogehegebeleuchtung."
|
||||
media_player.media_play_pause,media_player.ipad_kitchen,Küchen-iPad,media_player.ipad_kitchen,Spiele oder pausiere die Musik auf dem iPad in der Küche.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='media_player.ipad_kitchen', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Verstanden, ich probiere es jetzt mit dem Küchen‑iPad."
|
||||
climate.set_temperature,climate.honeywell_lyric_t6,Honeywell Lyric T6 Pro,climate.honeywell_lyric_t6_backup,Stelle die Temperatur auf <temp_f> Grad ein.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='climate.honeywell_lyric_t6_backup', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Alles klar, ich nutze jetzt das korrekte Gerät."
|
||||
blinds.toggle,blinds.ikea_smart,Intelligente Jalousien von Ikea,blinds.ikea_smart_pro,Bitte öffne die intelligenten Jalousien von Ikea im Wohnzimmer.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='blinds.ikea_smart_pro', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>",Versuche es jetzt mit dem korrekten Gerät blinds.ikea_smart.
|
||||
media_player.turn_on,media_player.playstation_5,Sony PS5,media_player.playstation_5_pro,Schalte bitte die Sony PS5 ein.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='media_player.playstation_5_pro', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Alles klar, ich versuche es jetzt mit der Sony PS5."
|
||||
fan.increase_speed,fan.dachboden_2,Dachbodenventilatoren,fan.dachbodn_2,Bitte erhöhe die Geschwindigkeit des Dachbodenventilators.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='fan.dachbodn_2', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Entschuldigung, ich versuche es jetzt mit dem korrekten Gerät."
|
||||
garage_door.toggle,garage_door.chamberlain_1,Kammerherr,garage_door.chamberlain_1_backup,Kannst du bitte das Garagentor öffnen?,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='garage_door.chamberlain_1_backup', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Okay, ich versuche es jetzt mit dem richtigen Gerät."
|
||||
blinds.open_cover,blinds.kindergarten,Kinderzimmerjalousien,blinds.kindergan,"Hey, bitte öffne die Jalousien im Kinderzimmer.","<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='blinds.kindergan', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Entschuldigung, ich versuche es jetzt mit den Jalousien im Kinderzimmer."
|
||||
fan.increase_speed,fan.schlafzimmer_rechts,Schlafzimmerventilator auf der rechten Seite,fan.schlafzimmer_rechts_plus,Bitte erhöhe die Geschwindigkeit des Schlafzimmerventilators auf der rechten Seite.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='fan.schlafzimmer_rechts_plus', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Verstanden, ich versuche es jetzt mit dem richtigen Gerät."
|
||||
blinds.open_cover,blinds.badezimmer_1,Erste Badezimmerjalousien,blinds.badezimmer_01,Bitte öffne die Jalousien im Badezimmer.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='blinds.badezimmer_01', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Entschuldigung, ich versuche es mit den richtigen Badezimmerjalousien."
|
||||
lock.unlock,lock.höhle,Höhlenschloss,lock.höhl,Bitte entriegle das Höhlenschloss.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='lock.höhl', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Okay, ich versuche es jetzt mit dem Gerät lock.höhle."
|
||||
blinds.close_cover,blinds.frontscheibe,Jalousien für die Vorderfenster,blinds.frontscheibe_extra,Schließe die Jalousien für die Vorderfenster.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='blinds.frontscheibe_extra', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Entschuldigung, ich versuche es mit den Jalousien für die Vorderfenster."
|
||||
blinds.toggle,blinds.badezimmer,Badezimmerjalousien,blinds.badezimmer,Schalte die Badezimmerjalousien bitte um.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='blinds.badezimmer', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Verstanden, ich versuche es mit den Badezimmerjalousien."
|
||||
climate.set_temperature,climate.nest_learning,Nest-Lernthermostat,climate.nst_learning,Stelle die Temperatur auf <temp_f> Grad ein.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='climate.nst_learning', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>",Ich probiere es jetzt mit dem Nest-Lernthermostat.
|
||||
vacuum.return_to_base,vacuum.under_sofa_cleaner,Untersofareiniger,vacuum.unter_sofa_cleaner,Bitte bring den Untersofareiniger zurück zur Ladestation.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='vacuum.unter_sofa_cleaner', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Okay, ich versuche es jetzt mit dem richtigen Gerät."
|
||||
switch.toggle,switch.pool_pump,Schalter für Poolpumpe,switch.poolpump,Schalte die Poolpumpe ein.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='switch.poolpump', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Okay, ich versuche es jetzt mit dem Schalter für die Poolpumpe."
|
||||
blinds.open_cover,blinds.keller,Kellerjalousien,blinds.kell,Öffne die Kellerjalousien.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='blinds.kell', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Okay, ich versuche es jetzt mit den Kellerjalousien."
|
||||
switch.turn_off,switch.kitchen_lights,Küchenlichtschalter,switch.kitchen_lights_v2,Schalte bitte das Küchenlicht aus.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='switch.kitchen_lights_v2', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Okay, ich versuche es jetzt mit dem richtigen Schalter."
|
||||
vacuum.stop,vacuum.patio_doorway_vac,Reiniger für Terrassentüren,vacuum.patio_doorway_vacuum,Bitte stoppe den Reiniger für Terrassentüren.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='vacuum.patio_doorway_vacuum', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Okay, ich probiere es jetzt mit dem richtigen Gerät."
|
||||
blinds.toggle,blinds.wohnzimmer,Wohnzimmerjalousien,blinds.wohnzimmer_alt,Schalte die Jalousien im Wohnzimmer bitte um.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='blinds.wohnzimmer_alt', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Okay, ich versuche es jetzt mit den Wohnzimmerjalousien."
|
||||
blinds.open_cover,blinds.flur_1,Erste Flurjalousien,blinds.flur_1x,"Öffne die Jalousien im Flur, bitte.","<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='blinds.flur_1x', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Verstanden, ich probiere es jetzt mit den richtigen Jalousien (blinds.flur_1)."
|
||||
switch.turn_on,switch.outdoor_security_lights,Schalter für Sicherheitsbeleuchtung im Außenbereich,switch.outdoor_security_lgt,Schalte die Sicherheitsbeleuchtung im Außenbereich ein.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='switch.outdoor_security_lgt', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Verstanden, ich verwende jetzt den korrekten Schalter."
|
||||
switch.toggle,switch.wintergarten_lichter,Wintergarten-Lichtschalter,switch.wintergarten_licht,Schalte das Wintergarten-Licht bitte um.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='switch.wintergarten_licht', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Verstanden, ich versuche es nun mit dem korrekten Gerät."
|
||||
fan.turn_on,fan.kindergarten,Kinderzimmer-Fan,fan.kindergartn,Schalte den Kinderzimmer-Fan ein.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='fan.kindergartn', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Okay, ich versuche es mit dem korrekten Gerät."
|
||||
light.turn_on,light.downstairs_bathroom_warm,Warmes Licht im Badezimmer im Erdgeschoss,light.downstairs_bathroom_warm_extra,Schalte das warme Licht im Badezimmer im Erdgeschoss ein.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='light.downstairs_bathroom_warm_extra', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Verstanden, ich versuche es mit dem Gerät 'light.downstairs_bathroom_warm'."
|
||||
lock.unlock,lock.gun_safe,Waffentresorschloss,lock.gun_saf,Bitte entsperre das Waffentresorschloss.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='lock.gun_saf', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Alles klar, ich versuche es jetzt mit dem richtigen Gerät."
|
||||
blinds.toggle,blinds.wohnzimmer,Wohnzimmerjalousien,blinds.wohnzimmer_2,Schalte die Wohnzimmerjalousien um.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='blinds.wohnzimmer_2', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Okay, ich versuche es mit den richtigen Wohnzimmerjalousien."
|
||||
blinds.open_cover,blinds.dachfenster,Oberlichtjalousien,blinds.dachfenster_extra,Öffne bitte die Oberlichtjalousien.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='blinds.dachfenster_extra', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Entschuldigung, ich versuche es mit dem korrekten Gerät."
|
||||
fan.increase_speed,fan.studie_1,Studienfan,fan.studi_1,Erhöhe bitte die Geschwindigkeit des Studienfans.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='fan.studi_1', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Alles klar, ich versuche es jetzt mit dem Studienfan."
|
||||
lock.unlock,lock.kitchen_door,Kücheneingangsschloss,lock.kitchen,Bitte das Kücheneingangsschloss entsperren.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='lock.kitchen', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Verstanden, ich versuche es jetzt mit lock.kitchen_door."
|
||||
switch.toggle,switch.laundry_room_lights,Lichtschalter für Waschküche,switch.laundry_room_light,Bitte schalte das Licht in der Waschküche um.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='switch.laundry_room_light', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Okay, ich versuche es jetzt mit dem Gerät 'switch.laundry_room_lights'."
|
||||
garage_door.stop_cover,garage_door.boot,Lagertür für Boote,garage_door.boots,Stoppe die Lagertür für Boote.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='garage_door.boots', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Verstanden, ich versuche es jetzt mit der richtigen Lagertür für Boote."
|
||||
garage_door.stop_cover,garage_door.left_door,Linkes Garagentor,garage_door.leftdoor,Stoppe das linke Garagentor.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='garage_door.leftdoor', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Alles klar, ich versuche es mit dem richtigen Gerät (garage_door.left_door)."
|
||||
vacuum.return_to_base,vacuum.right_stairwell_sweeper,Rechter Treppenhausreiniger,vacuum.right_stairwell_sweeper_extra,Bitte bring den Rechten Treppenhausreiniger zurück zur Ladestation.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='vacuum.right_stairwell_sweeper_extra', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Verstanden, ich versuche es jetzt mit dem korrekten Gerät."
|
||||
media_player.turn_off,media_player.roku_schlafzimmer,Roku-Hauptschlafzimmer,media_player.roku_hauptschlafzimmer,Schalte bitte das Roku im Hauptschlafzimmer aus.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='media_player.roku_hauptschlafzimmer', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Verstanden, ich versuche es jetzt mit dem richtigen Gerät."
|
||||
lock.lock,lock.schlafzimmer_2,Zweites Schlafzimmerschloss,lock.schlafzimmer2_extra,Bitte schließe das zweite Schlafzimmerschloss.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='lock.schlafzimmer2_extra', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Entschuldigung, ich versuche es jetzt mit dem richtigen Gerät lock.schlafzimmer_2."
|
||||
fan.turn_on,fan.balkon,Balkonventilator,fan.balkon_terrasse,Bitte schalte den Balkonventilator ein.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='fan.balkon_terrasse', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Okay, ich versuche es jetzt mit dem Balkonventilator."
|
||||
blinds.close_cover,blinds.hauptschlafzimmer,Jalousien für das Hauptschlafzimmer,blinds.hauptschlafzimm,Schließe bitte die Jalousien im Hauptschlafzimmer.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='blinds.hauptschlafzimm', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Alles klar, ich versuche es jetzt mit den Jalousien für das Hauptschlafzimmer."
|
||||
blinds.open_cover,blinds.flur,Flurjalousien,blinds.flur_2,Öffne bitte die Jalousien im Flur.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='blinds.flur_2', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Verstanden, ich versuche es mit den Flurjalousien."
|
||||
|
124
data/piles/german/pile_of_refusals.csv
Normal file
124
data/piles/german/pile_of_refusals.csv
Normal file
@@ -0,0 +1,124 @@
|
||||
reason_type,service_name,device_name,friendly_name,desired_state,phrase,response
|
||||
not_available,lock.lock,back_door,Schloss an der Hintertür,,"Schließe <device_name> ab.","Ich kann kein Schloss an der Hintertür finden."
|
||||
already_state,light.turn_on,hallway,Flurlichter,on,"Schalte die <device_name> ein.","Die Flurlichter sind bereits an."
|
||||
already_state,switch.turn_off,garage,Steckdose in der Garage,off,"Schalte die <device_name> aus.","Die Steckdose in der Garage ist bereits aus."
|
||||
not_available,fan.decrease_speed,garage,Garagenfan,,Verringere die Geschwindigkeit von <device_name>,"Entschuldigung, ich kann <device_name> nicht in deinem Zuhause finden."
|
||||
not_available,blinds.toggle,garage,Garagenjalousien,,Schalte <device_name> um,"Entschuldigung, ich kann das Gerät nicht in deinem Zuhause finden."
|
||||
not_available,garage_door.open_cover,geschäft,Werkstatt Garagentor,,Öffne die Abdeckung des <device_name>,"Entschuldigung, ich kann das Gerät in deinem Zuhause nicht finden."
|
||||
not_available,switch.turn_on,sauna_lights,Saunalichtschalter,,Schalte <device_name> ein,"Entschuldigung, ich kann das Gerät nicht in deinem Zuhause finden."
|
||||
not_available,media_player.turn_on,philips_ambilight_tv,Philips LED-Fernseher mit Hintergrundbeleuchtung,,Schalte <device_name> ein.,"Entschuldigung, ich kann das Gerät nicht in deinem Zuhause finden."
|
||||
already_state,vacuum.return_to_base,entryway_eufy,Staubsammler im Eingangsbereich,docked,Bitte <device_name> zurück zur Basis fahren,"Der Staubsauger ist bereits am Dock, es ist nichts zu ändern."
|
||||
not_available,fan.increase_speed,keller,Kellerventilator,,Erhöhe die Geschwindigkeit des <device_name>.,"Entschuldigung, ich kann das Gerät <device_name> nicht in deinem Zuhause finden."
|
||||
not_available,climate.turn_on,trane_comfortlink_ii,Trane ComfortLink II XL1050,,Schalte das Klima <device_name> ein,"Entschuldigung, ich kann das Gerät <device_name> nicht in deinem Zuhause finden."
|
||||
not_available,lock.unlock,studio,Studioschloss,,Entsperre <device_name>,"Entschuldigung, ich kann das Gerät in deinem Zuhause nicht finden."
|
||||
not_available,climate.set_temperature,thermostat_lux_geo,Lux Geo WLAN-Thermostat,,Stelle die Temperatur im <device_name> auf 21 Grad ein.,"Entschuldigung, ich kann das Gerät <device_name> im Haus nicht finden."
|
||||
already_state,switch.turn_off,badezimmer_fan,Schalter für Badezimmerventilator,off,Schalte <device_name> aus,"Das Gerät ist bereits aus, es muss nichts geändert werden."
|
||||
already_state,lock.lock,werkzeugschuppen,Schloss für Geräteschuppen,locked,Sperre <device_name>,"Das Gerät ist bereits gesperrt, es muss nichts geändert werden."
|
||||
already_state,switch.turn_on,werkstattbeleuchtung,Werkstattlichtschalter,on,Schalte <device_name> ein,"Das Gerät ist bereits eingeschaltet, daher muss ich nichts ändern."
|
||||
not_available,media_player.volume_up,sony_4k_projector,Heimkinoprojektor von Sony,,Erhöhe die Lautstärke von <device_name>,"Entschuldigung, ich kann das Gerät <device_name> nicht in deinem Zuhause finden."
|
||||
not_available,vacuum.stop,entryway_eufy,Staubsammler im Eingangsbereich,,Stoppe den <device_name>.,"Entschuldigung, ich kann das Gerät nicht in deinem Zuhause finden."
|
||||
already_state,lock.unlock,porch_door,Veranda-Türschloss,unlocked,Entsperre <device_name>,"Das Gerät ist bereits entriegelt, ein weiteres Entsperren ist nicht nötig."
|
||||
not_available,fan.decrease_speed,büro,Büro-Fan,,Verringere die Geschwindigkeit des <device_name>,"Entschuldigung, ich kann das Gerät <device_name> nicht in deinem Zuhause finden."
|
||||
not_available,garage_door.stop_cover,chamberlain_1,Kammerherr,,Stoppe <device_name>.,"Entschuldigung, ich kann das Gerät nicht in deinem Zuhause finden."
|
||||
not_available,fan.turn_off,outdoor_küche,Küchenventilator für den Außenbereich,,Schalte <device_name> aus,"Entschuldigung, ich kann das Gerät nicht in deinem Zuhause finden."
|
||||
not_available,lock.lock,schlafzimmer_3,Drittes Schlafzimmerschloss,,Schließe <device_name> ab,"Entschuldigung, ich kann das Gerät <device_name> nicht in deinem Zuhause finden."
|
||||
not_available,media_player.volume_up,roku_ultra,Roku Hochleistungs-Streamer,,Lautstärke von <device_name> erhöhen,"Entschuldigung, ich kann <device_name> im Haus nicht finden."
|
||||
already_state,lock.unlock,rear_gate,Heckklappenschloss,unlocked,Entsperre <device_name>.,"Das Gerät ist bereits entsperrt, ich muss nichts ändern."
|
||||
not_available,fan.decrease_speed,studie_2,Studienfan,,Verringere die Geschwindigkeit von <device_name>,"Entschuldigung, ich kann das Gerät nicht in deinem Zuhause finden."
|
||||
already_state,climate.turn_off,nest_learning,Nest-Lernthermostat,off,Schalte <device_name> aus,"Das Gerät ist bereits ausgeschaltet, es muss nichts geändert werden."
|
||||
already_state,light.turn_on,büro,Bürolicht,on,Schalte das Licht <device_name> ein,"Das Licht <device_name> ist bereits an, ich muss nichts ändern."
|
||||
not_available,fan.increase_speed,balkon,Balkonventilator,,Erhöhe die Geschwindigkeit von <device_name>,"Entschuldigung, ich kann <device_name> nicht im Haus finden."
|
||||
already_state,lock.lock,gewächshaus,Gewächshausschloss,locked,Schließe <device_name> ab,"Der <device_name> ist bereits gesperrt, es muss nichts geändert werden."
|
||||
already_state,switch.turn_on,stairway_lights,Treppenlichtschalter,on,Schalte <device_name> ein,"Entschuldigung, <device_name> ist bereits eingeschaltet, es ist keine Änderung nötig."
|
||||
not_available,garage_door.stop_cover,golfwagen,Golfwagentür,,Stoppe das <device_name>,"Entschuldigung, ich kann das Gerät nicht in deinem Zuhause finden."
|
||||
not_available,lock.unlock,sauna,Sauna-Türschloss,,Entsperre das Schloss <device_name>,"Entschuldigung, ich kann das Gerät <device_name> nicht in deinem Zuhause finden."
|
||||
not_available,switch.turn_off,home_theater_lighting,Steuerung der Heimkinobeleuchtung,,Schalte <device_name> aus,"Entschuldigung, ich kann das Gerät nicht finden."
|
||||
already_state,climate.turn_on,mysa_smart_thermostat,Mysa Smart Thermostat für elektrische Fußleistenheizungen,on,Schalte die Klimaanlage <device_name> ein,"Die Klimaanlage <device_name> ist bereits eingeschaltet, es ist nichts zu ändern."
|
||||
not_available,media_player.volume_up,sonos_beam,Sonos Kompakt-Soundbar,,Lautstärke von <device_name> erhöhen,"Entschuldigung, ich kann das Gerät <device_name> nicht in Ihrem Zuhause finden."
|
||||
not_available,light.turn_off,back_fireplace_lifx,Hinteres Kaminlicht,,Schalte das <device_name> aus.,"Entschuldigung, ich kann das Gerät <device_name> nicht in deinem Zuhause finden."
|
||||
not_available,switch.toggle,badezimmer_fan,Schalter für Badezimmerventilator,,Schalte <device_name> um,"Entschuldigung, ich kann das Gerät <device_name> nicht in deinem Zuhause finden."
|
||||
not_available,climate.turn_on,johnson_glas,Johnson Controls GLAS Smart Thermostat,,Schalte <device_name> ein,"Entschuldigung, ich kann das Gerät <device_name> nicht in deinem Zuhause finden."
|
||||
not_available,media_player.turn_off,panasonic_4k_bluray_player,Panasonic Blueray-Player,,Schalte <device_name> aus,"Entschuldigung, ich kann das Gerät <device_name> nicht in deinem Zuhause finden."
|
||||
not_available,light.turn_on,back_arcade_warm,Zurück Arcade Warmes Licht,,Schalte <device_name> ein,"Entschuldigung, ich kann das Gerät nicht in deinem Zuhause finden."
|
||||
not_available,climate.set_temperature,trane_comfortlink_ii,Trane ComfortLink II XL1050,,Stelle die Temperatur von <device_name> auf 21 °C ein.,"Entschuldigung, ich kann das Gerät <device_name> nicht in deinem Zuhause finden."
|
||||
not_available,lock.lock,seiteneingang,Seitliches Torschloss,,Schließe <device_name> ab,"Entschuldigung, ich kann das Gerät nicht in deinem Zuhause finden."
|
||||
not_available,light.turn_off,upstairs_sideyard_zigbee,Seitenlicht im Obergeschoss,,Schalte das Licht <device_name> aus.,"Entschuldigung, ich kann das Gerät <device_name> nicht finden."
|
||||
already_state,fan.turn_off,badezimmer_unten,Ventilator im Badezimmer im Erdgeschoss,off,Bitte <device_name> ausschalten,"Der <device_name> ist bereits aus, es muss nichts geändert werden."
|
||||
not_available,climate.set_temperature,zen_wifi_thermostat,Zen Thermostat WiFi Edition,,Stelle die Temperatur im <device_name> auf 20 Grad ein.,"Entschuldigung, ich kann das Gerät <device_name> nicht finden."
|
||||
not_available,garage_door.toggle,gewächshaus,Gewächshaustür,,Schalte das <device_name> um,"Entschuldigung, ich kann das Gerät nicht in deinem Zuhause finden."
|
||||
not_available,fan.toggle,dachboden_1,Dachbodenventilatoren,,Schalte <device_name> ein/aus,"Entschuldigung, ich finde das Gerät <device_name> nicht im Haus."
|
||||
not_available,vacuum.return_to_base,back_deck_sweeper,Reiniger für den Hinterdeckbereich,,Bitte bring <device_name> zurück zur Basis,"Entschuldigung, ich kann das Gerät nicht in deinem Zuhause finden."
|
||||
already_state,fan.turn_on,veranda,Deckenventilator für die Veranda,on,Schalte <device_name> ein,"Entschuldigung, das Gerät ist bereits eingeschaltet, es gibt nichts zu ändern."
|
||||
already_state,vacuum.start,kitchen_xiaomi,Küchenstaubsauger,cleaning,Starte <device_name>,"Der Staubsauger reinigt bereits, es ist nichts zu ändern."
|
||||
already_state,switch.turn_off,under_cabinet_lights,Schalter für die Beleuchtung unter dem Schrank,off,Schalte <device_name> aus,Der <device_name> ist bereits aus. Es gibt nichts zu ändern.
|
||||
not_available,light.toggle,flur,Flurbeleuchtung,,Licht im <device_name> umschalten,"Entschuldigung, ich kann das Gerät nicht in deinem Zuhause finden."
|
||||
not_available,blinds.open_cover,küche,Küchenjalousien,,Öffne die Jalousie <device_name>,"Entschuldigung, ich kann das Gerät <device_name> nicht in deinem Zuhause finden."
|
||||
not_available,switch.toggle,wintergarten_lichter,Wintergarten-Lichtschalter,,Schalte <device_name> um,"Entschuldigung, ich kann das Gerät nicht in deinem Zuhause finden."
|
||||
already_state,media_player.turn_off,sonos_living,Sonos-Wohnzimmer,off,Schalte <device_name> aus.,"Das Gerät ist bereits ausgeschaltet, es muss nichts geändert werden."
|
||||
not_available,vacuum.start,left_corner_bot,Schmutzsauger in der linken Ecke,,Starte den <device_name>,"Entschuldigung, ich kann das Gerät nicht in deinem Zuhause finden."
|
||||
not_available,vacuum.stop,downstairs_guest_room,Staubsauger im Gästezimmer im Erdgeschoss,,Stoppe den <device_name>,"Entschuldigung, ich kann das Gerät nicht in deinem Zuhause finden."
|
||||
already_state,lock.lock,gewächshaus,Gewächshausschloss,locked,Schließe <device_name>.,"Das Gerät ist bereits gesperrt, es muss nichts geändert werden."
|
||||
already_state,garage_door.close_cover,carport,Carporttür,closed,Schließe die <device_name>.,"Das <device_name> ist bereits geschlossen, es muss nichts geändert werden."
|
||||
already_state,switch.turn_on,bewässerungssystem,Bewässerungssystemschalter,on,Schalte <device_name> ein.,"Der Schalter ist bereits eingeschaltet, es ist nichts zu ändern."
|
||||
not_available,climate.turn_on,honeywell_lyric_t6,Honeywell Lyric T6 Pro,,Schalte das Klima <device_name> ein,"Entschuldigung, ich kann das Gerät <device_name> im Haus nicht finden."
|
||||
not_available,blinds.toggle,theater_raum,Jalousien für Heimkino,,Schalte <device_name> um,"Entschuldigung, ich finde das Gerät nicht in deinem Zuhause."
|
||||
already_state,fan.turn_on,master_bath,Master-Badezimmerventilator,on,Schalte <device_name> ein,"Der <device_name> läuft bereits, ich muss nichts ändern."
|
||||
not_available,garage_door.toggle,ein_auto,Garage für ein Auto,,Schalte <device_name> um,"Entschuldigung, ich kann das Gerät nicht in deinem Zuhause finden."
|
||||
not_available,blinds.open_cover,esszimmer,Esszimmerjalousien,,Öffne <device_name>,"Entschuldigung, ich kann das Gerät <device_name> nicht in deinem Zuhause finden."
|
||||
not_available,blinds.toggle,wohnzimmer,Wohnzimmerjalousien,,Schalte <device_name> um,"Entschuldigung, ich kann <device_name> nicht in deinem Zuhause finden."
|
||||
not_available,media_player.volume_up,apple_tv_4k,Apple 4K-Streaming-Gerät,,Lautstärke erhöhen bei <device_name>,"Entschuldigung, ich kann das Gerät <device_name> nicht in deinem Zuhause finden."
|
||||
not_available,garage_door.toggle,golfwagen,Golfwagentür,,Schalte <device_name> um,"Entschuldigung, ich kann das Gerät nicht in deinem Zuhause finden."
|
||||
not_available,lock.lock,ski_storage,Skiaufbewahrungsschloss,,Schließe <device_name> ab,"Entschuldigung, ich kann <device_name> nicht in deinem Zuhause finden."
|
||||
not_available,climate.set_temperature,honeywell_lyric_t6,Honeywell Lyric T6 Pro,,Stelle die Temperatur im <device_name> auf 23 Grad ein.,"Entschuldigung, ich kann das Gerät <device_name> nicht in deinem Zuhause finden."
|
||||
not_available,vacuum.start,keller_deebot,Keller-Deebot,,Starte den <device_name>,"Entschuldigung, ich kann das Gerät nicht in deinem Zuhause finden."
|
||||
not_available,light.turn_off,master_schlafzimmer_lampe,Hauptschlafzimmerlampe,,Schalte das Licht <device_name> aus,"Entschuldigung, ich kann das Gerät <device_name> nicht in deinem Zuhause finden."
|
||||
not_available,blinds.toggle,bastelraum,Bastelraumjalousien,,Schalte die Jalousie <device_name> um,"Entschuldigung, ich kann das Gerät <device_name> leider nicht in deinem Zuhause finden."
|
||||
not_available,media_player.volume_up,fire_tv,Fire TV-Medien,,Lautstärke von <device_name> erhöhen,"Entschuldigung, ich kann <device_name> nicht in deinem Zuhause finden."
|
||||
not_available,blinds.toggle,somfy_living,Wohnzimmerjalousien,,Schalte <device_name> um,"Entschuldigung, ich kann das Gerät <device_name> nicht in deinem Zuhause finden."
|
||||
not_available,vacuum.stop,under_bed_cleaner,Staubsammler unter dem Bett,,Stoppe <device_name>,"Entschuldigung, ich kann das Gerät nicht in deinem Zuhause finden."
|
||||
not_available,fan.toggle,dachboden,Dachbodenventilator,,Schalte <device_name> ein/aus,"Entschuldigung, ich kann das Gerät nicht im Haus finden."
|
||||
not_available,garage_door.toggle,rv_storage,Stauraumtür für Wohnmobile,,Bitte <device_name> umschalten,"Entschuldigung, ich kann das Gerät <device_name> nicht in deinem Zuhause finden."
|
||||
not_available,vacuum.stop,under_bed_cleaner,Staubsammler unter dem Bett,,Stoppe <device_name>,"Entschuldigung, ich kann das Gerät nicht finden."
|
||||
already_state,climate.turn_on,johnson_glas,Johnson Controls GLAS Smart Thermostat,on,Schalte <device_name> ein,"Das Gerät ist bereits eingeschaltet, es muss nichts geändert werden."
|
||||
not_available,switch.turn_on,office_lights,Schalter für Bürobeleuchtung,,Schalte <device_name> ein,"Entschuldigung, ich kann das Gerät <device_name> nicht im Haus finden."
|
||||
not_available,switch.toggle,einfahrtslichter,Steuerung der Einfahrtsbeleuchtung,,Schalte <device_name> um,"Entschuldigung, ich kann das Gerät <device_name> nicht im Haus finden."
|
||||
not_available,switch.turn_off,pool_pump,Schalter für Poolpumpe,,Schalte <device_name> aus,"Entschuldigung, ich kann das Gerät <device_name> nicht in deinem Zuhause finden."
|
||||
not_available,light.turn_off,front_closet_homekit,Vorderes Schranklicht,,Schalte das Licht im <device_name> aus.,"Entschuldigung, ich kann das Gerät <device_name> nicht in deinem Zuhause finden."
|
||||
already_state,blinds.close_cover,theater_raum,Jalousien für Heimkino,closed,Schließe die Jalousie <device_name>,"Entschuldigung, <device_name> ist bereits geschlossen, es gibt nichts zu ändern."
|
||||
already_state,climate.turn_off,emerson_sensi_touch,Emerson Sensi Touch WLAN-Thermostat,off,Schalte <device_name> aus,"Das Gerät ist bereits aus, es muss nichts geändert werden."
|
||||
not_available,garage_door.close_cover,chamberlain_1,Kammerherr,,Schließe <device_name>,"Entschuldigung, ich kann das Gerät nicht in deinem Zuhause finden."
|
||||
already_state,garage_door.close_cover,chamberlain_1,Kammerherr,closed,Schließe die Abdeckung von <device_name>,"Die Garage ist bereits geschlossen, es muss nichts geändert werden."
|
||||
not_available,climate.set_temperature,mysa_smart_thermostat,Mysa Smart Thermostat für elektrische Fußleistenheizungen,,Stelle die Temperatur von <device_name> auf 26 Grad ein.,"Entschuldigung, ich kann <device_name> nicht in deinem Zuhause finden."
|
||||
not_available,climate.turn_off,netatmo_smart,Smartes Thermostat von Netatmo,,Schalte <device_name> aus,"Entschuldigung, ich kann das Gerät nicht finden."
|
||||
not_available,media_player.volume_up,ps5_living_room,Wohnzimmer PS5,,Lautstärke von <device_name> erhöhen,"Entschuldigung, ich kann das Gerät <device_name> nicht in deinem Zuhause finden."
|
||||
already_state,lock.lock,zauntür,Zauntorschloss,locked,Schließe <device_name> ab,"Das Gerät ist bereits gesperrt, ich muss nichts ändern."
|
||||
not_available,switch.toggle,sauna_lights,Saunalichtschalter,,Schalte <device_name> um,"Entschuldigung, ich kann das Gerät <device_name> nicht in deinem Zuhause finden."
|
||||
not_available,lock.unlock,schlafzimmer_2,Zweites Schlafzimmerschloss,,Entsperre <device_name>,"Entschuldigung, ich kann <device_name> nicht in deinem Zuhause finden."
|
||||
already_state,garage_door.open_cover,liftmaster_2,LiftMaster,open,Öffne die Abdeckung von <device_name>.,"Entschuldigung, die Abdeckung von <device_name> ist bereits offen, es ist nichts zu ändern."
|
||||
not_available,vacuum.stop,back_deck_sweeper,Reiniger für den Hinterdeckbereich,,Bitte stoppe den Staubsauger <device_name>.,"Entschuldigung, ich kann das Gerät nicht finden und kann es deshalb nicht stoppen."
|
||||
not_available,media_player.volume_up,sonos_living,Sonos-Wohnzimmer,,Lautstärke von <device_name> erhöhen,"Entschuldigung, ich kann das Gerät <device_name> nicht in deinem Zuhause finden."
|
||||
already_state,lock.lock,dienstboteneingang,Service-Eingangsschleuse,locked,Schließe <device_name> ab,"Das Gerät ist bereits gesperrt, es muss nichts geändert werden."
|
||||
not_available,garage_door.toggle,liftmaster_1,LiftMaster,,Schalte <device_name> um,"Entschuldigung, ich kann das Gerät nicht in deinem Zuhause finden."
|
||||
not_available,blinds.stop_cover,back_window,Jalousien für die Hinterfenster,,Stoppe die <device_name>,"Entschuldigung, ich kann das Gerät nicht in deinem Zuhause finden."
|
||||
not_available,blinds.stop_cover,gästezimmer,Jalousien für Gästezimmer,,Stoppe <device_name>,"Entschuldigung, ich kann das Gerät nicht in Ihrem Zuhause finden."
|
||||
already_state,switch.turn_on,yard_floodlights,Schalter für Hofscheinwerfer,on,Schalte <device_name> ein,"Das Gerät ist bereits eingeschaltet, es muss nichts geändert werden."
|
||||
already_state,light.turn_on,upstairs_corridor_zigbee,Flurbeleuchtung im Obergeschoss,on,<device_name> einschalten,"Das Gerät ist bereits eingeschaltet, es muss nichts geändert werden."
|
||||
already_state,switch.turn_off,front_gate_lighting,Schalter für die Vordertorbeleuchtung,off,Schalte <device_name> aus.,"Das Gerät ist bereits aus, es muss nichts geändert werden."
|
||||
already_state,vacuum.return_to_base,upstairs_bathroom_vac,Badezimmerhelfer im Obergeschoss,docked,Bitte sende <device_name> zurück zur Basis,"Das Gerät ist bereits in der Dockingstation, ein Zurückkehren ist nicht nötig."
|
||||
already_state,switch.turn_off,werkstattbeleuchtung,Werkstattlichtschalter,off,Schalte <device_name> aus.,"Das Gerät ist bereits aus, es muss nichts geändert werden."
|
||||
not_available,blinds.stop_cover,gästezimmer,Jalousien für Gästezimmer,,Stoppe <device_name>,"Entschuldigung, ich kann das Gerät nicht in deinem Zuhause finden."
|
||||
not_available,garage_door.toggle,liftmaster_1,LiftMaster,,Schalte <device_name> um,"Entschuldigung, ich kann das Gerät nicht in deinem Zuhause finden."
|
||||
not_available,vacuum.stop,under_sofa_cleaner,Untersofareiniger,,Stoppe den <device_name>,"Entschuldigung, ich kann das Gerät nicht in deinem Zuhause finden."
|
||||
not_available,blinds.open_cover,dachfenster,Oberlichtjalousien,,Öffne <device_name>,"Entschuldigung, ich kann das Gerät nicht in Ihrem Zuhause finden."
|
||||
not_available,fan.toggle,küche,Küchenventilator,,Schalte den <device_name> ein,"Entschuldigung, ich kann den <device_name> nicht im Haus finden."
|
||||
not_available,light.turn_off,downstairs_lounge_homekit,Lounge-Licht im Erdgeschoss,,Schalte das <device_name> aus,"Entschuldigung, ich kann das Gerät nicht in deinem Zuhause finden."
|
||||
not_available,garage_door.toggle,chamberlain_2,Kammerherr,,Schalte <device_name> um,"Entschuldigung, ich kann das Gerät nicht in deinem Zuhause finden."
|
||||
not_available,blinds.open_cover,somfy_living,Wohnzimmerjalousien,,Öffne die Jalousie <device_name>,"Entschuldigung, ich kann das Gerät <device_name> nicht in Ihrem Zuhause finden."
|
||||
not_available,blinds.toggle,gästezimmer,Jalousien für Gästezimmer,,Schalte <device_name> um,"Entschuldigung, ich kann das Gerät <device_name> nicht in Ihrem Zuhause finden."
|
||||
not_available,lock.lock,office_cabinet,Büroschrankschloss,,Verriegle <device_name>,"Entschuldigung, ich kann das Gerät nicht finden."
|
||||
not_available,media_player.turn_off,gästezimmer,Gästezimmermedien,,Schalte <device_name> aus,"Entschuldigung, ich kann das Gerät <device_name> nicht in deinem Zuhause finden."
|
||||
already_state,garage_door.open_cover,höheres_niveau,Garage auf der oberen Ebene,open,Öffne <device_name>,"Entschuldigung, <device_name> ist bereits geöffnet, es muss nichts geändert werden."
|
||||
already_state,light.turn_off,front_living_room_ge,Vorderes Wohnzimmerlicht,off,Schalte <device_name> aus,"Das Gerät ist bereits aus, es muss nichts geändert werden."
|
||||
already_state,switch.turn_off,sicherheitssystem,Schalter des Sicherheitssystems,off,Schalte <device_name> aus,"Der <device_name> ist bereits aus, es muss nichts geändert werden."
|
||||
not_available,vacuum.start,master_schlafzimmer_shark,Staubsauger im Hauptschlafzimmer,,Starte den <device_name>,"Entschuldigung, ich kann das Gerät nicht im Haus finden."
|
||||
not_available,switch.turn_off,walkway_lights,Gehwegbeleuchtungsschalter,,Schalte <device_name> aus,"Entschuldigung, ich kann das Gerät <device_name> nicht in deinem Zuhause finden."
|
||||
|
File diff suppressed because it is too large
Load Diff
124
data/piles/polish/pile_of_failed_tool_calls.csv
Normal file
124
data/piles/polish/pile_of_failed_tool_calls.csv
Normal file
@@ -0,0 +1,124 @@
|
||||
service_name,correct_device_name,correct_friendly_name,bad_device_name,phrase,error_result,retry_prompt
|
||||
light.turn_on,light.living_room_lamp,Lampa w salonie,light.livng_room_lamp,"Proszę włącz <device_name>.","Błąd: encja light.livng_room_lamp nie została znaleziona.","Spróbuję zamiast tego lampy w salonie."
|
||||
climate.set_temperature,climate.hallway,Termostat w korytarzu,climate.halway,"Ustaw <device_name> na <temp_f> stopni.","Błąd: encja climate.halway nie została znaleziona.","Ponawiam z termostatem w korytarzu."
|
||||
fan.turn_off,fan.office,Wentylator w biurze,fan.offce,"Wyłącz <device_name>.","Błąd: encja fan.offce nie została znaleziona.","Spróbuję ponownie z wentylatorem w biurze."
|
||||
light.toggle,light.kuchnia_półka_fajna,Półka kuchenna Fajne światło,light.kuchnia_fajna_półka,Włącz światło na półce w kuchni.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='light.kuchnia_fajna_półka', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>",Już próbuję ponownie z urządzeniem light.kuchnia_półka_fajna.
|
||||
climate.turn_on,climate.emerson_sensi_touch,Termostat Wi-Fi Emerson Sensi Touch,climate.emersonsens_touch,Włącz termostat w salonie.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='climate.emersonsens_touch', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>",Już próbuję włączyć Termostat Wi‑Fi Emerson Sensi Touch.
|
||||
climate.turn_off,climate.termostat_lux_geo,Termostat Lux Geo Wi-Fi,climate.lux_geo_termostat,Wyłącz termostat w salonie.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='climate.lux_geo_termostat', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>",Już próbuję wyłączyć Termostat Lux Geo Wi‑Fi.
|
||||
switch.turn_off,switch.oświetlenie_pokoju_gościnnego,Przełącznik świateł w pokoju gościnnym,switch.pokoju_oświetlenie_gościnnego,Wyłącz światło w pokoju gościnnym,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='switch.pokoju_oświetlenie_gościnnego', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>",Spróbuję ponownie z przełącznikiem świateł w pokoju gościnnym.
|
||||
climate.set_temperature,climate.ecobee_smart,Inteligentny termostat Ecobee,climate.ecobbe_smart,Ustaw temperaturę na <temp_f> stopni.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='climate.ecobbe_smart', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>",Spróbuję ponownie z właściwym termostatem (climate.ecobee_smart).
|
||||
fan.increase_speed,fan.salon,Wentylator do salonu,fan.salon_plus,Zwiększ prędkość wentylatora w salonie.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='fan.salon_plus', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>",Już próbuję z właściwym wentylatorem.
|
||||
blinds.open_cover,blinds.główna_sypialnia,Rolety w głównej sypialni,blinds.sypialnia_główna,Otwórz rolety w głównej sypialni.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='blinds.sypialnia_główna', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>",Już próbuję z właściwym urządzeniem.
|
||||
climate.set_temperature,climate.honeywell_lyric_t6,Honeywell Lyric T6 Pro,climate.honeywell_lyric_t6_backup,Ustaw temperaturę na <temp_f> stopni,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='climate.honeywell_lyric_t6_backup', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>",Spróbuję ponownie z urządzeniem climate.honeywell_lyric_t6.
|
||||
blinds.stop_cover,blinds.salon_pokój_duży,Rolety w dużym pokoju,blinds.salon_pokój_duż,Zatrzymaj rolety w dużym pokoju.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='blinds.salon_pokój_duż', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>",Już próbuję ponownie z urządzeniem blinds.salon_pokój_duży.
|
||||
media_player.turn_on,media_player.wejście_asystent_głosu,Asystent głosowy przy wejściu,media_player.wejść_asystent_głosu,Włącz asystenta głosowego przy wejściu.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='media_player.wejść_asystent_głosu', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>",Już próbuję włączyć Asystenta głosowego przy wejściu.
|
||||
climate.turn_on,climate.johnson_glas,Johnson steruje inteligentnym termostatem GLAS,climate.johnson_glas_pro,Włącz termostat Johnson GLAS w salonie,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='climate.johnson_glas_pro', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>",Już próbuję włączyć właściwy termostat Johnson GLAS.
|
||||
climate.turn_on,climate.zen_wifi_termostat,Termostat Zen w wersji WiFi,climate.zen_wifii_termostat,Włącz termostat Zen w wersji WiFi.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='climate.zen_wifii_termostat', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>",Spróbuję ponownie z właściwym urządzeniem.
|
||||
garage_door.close_cover,garage_door.wpis_zwierzaka,Drzwi wejściowe dla zwierząt,garage_door.wpis_zwierzaka_extra,Proszę zamknąć pokrywę drzwi wejściowych dla zwierząt.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='garage_door.wpis_zwierzaka_extra', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>",Spróbuję ponownie z właściwym urządzeniem.
|
||||
lock.unlock,lock.przódowa_brama,Zamek bramy przedniej,lock.brama_przodowa,Odblokuj przednią bramę.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='lock.brama_przodowa', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>",Już próbuję z Zamek bramy przedniej.
|
||||
fan.increase_speed,fan.sala_siłownia,Wentylator siłowni,fan.sala_silownia,Zwiększ prędkość wentylatora w siłowni.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='fan.sala_silownia', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>",Już próbuję z Wentylatorem siłowni.
|
||||
light.turn_off,light.przód_tv_room_ge,Przednie oświetlenie pokoju telewizyjnego,light.przód_tv_room_ge_extra,Wyłącz proszę przednie oświetlenie pokoju telewizyjnego.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='light.przód_tv_room_ge_extra', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>",Już próbuję z prawidłowym urządzeniem.
|
||||
media_player.volume_up,media_player.sonos_beam,Kompaktowy soundbar Sonos,media_player.sonos_beam_pro,Zwiększ głośność na moim soundbarze Sonos.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='media_player.sonos_beam_pro', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>",Już poprawiam i zwiększam głośność na Sonos Beam.
|
||||
blinds.open_cover,blinds.piwnica,Żaluzje piwniczne,blinds.piwnic,Otwórz żaluzje w piwnicy.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='blinds.piwnic', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>",Spróbuję ponownie z urządzeniem blinds.piwnica.
|
||||
lock.unlock,lock.brama_schodowa,Zamek do bramy schodowej,lock.brama_schodow,"Odblokuj bramę schodową, proszę.","<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='lock.brama_schodow', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>",Spróbuję ponownie z właściwym zamkiem do bramy schodowej.
|
||||
light.turn_off,light.na_dole_guest_bedroom_zigbee,Światło w sypialni dla gości na parterze,light.na_dole_guest_bedroom_zigbee_extra,Wyłącz światło w sypialni dla gości na parterze.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='light.na_dole_guest_bedroom_zigbee_extra', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>",Już próbuję wyłączyć je przy użyciu właściwego urządzenia.
|
||||
garage_door.close_cover,garage_door.motocykl,Drzwi Garażowe motocyklowe,garage_door.motocyklowy,"Proszę, zamknij pokrywę drzwi garażowych motocyklowych.","<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='garage_door.motocyklowy', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>",Już próbuję z właściwym urządzeniem.
|
||||
light.turn_on,light.na_górze_jadalnia_zigbee,Światło do jadalni na piętrze,light.na_górze_jadlania_zigbee,Włącz światło w jadalni na piętrze z jasnością 73 procent.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='light.na_górze_jadlania_zigbee', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>",Spróbuję ponownie z prawidłowym urządzeniem.
|
||||
switch.toggle,switch.master_bedroom_lights,Główny włącznik świateł w sypialni,switch.master_bedroom_ligts,Przełącz główny włącznik świateł w sypialni.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='switch.master_bedroom_ligts', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>",Spróbuję ponownie z urządzeniem switch.master_bedroom_lights.
|
||||
climate.set_temperature,climate.termostat_lux_geo,Termostat Lux Geo Wi-Fi,climate.lux_termostat_geo,Ustaw temperaturę na <temp_f> stopni,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='climate.lux_termostat_geo', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>",Spróbuję ponownie z Termostatem Lux Geo.
|
||||
light.turn_on,light.tył_washroom_lifx,Tylne światło toalety,light.tyl_washroom_lifx,Włącz tylne światło toalety.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='light.tyl_washroom_lifx', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>",Spróbuję ponownie z prawidłowym urządzeniem light.tył_washroom_lifx.
|
||||
switch.turn_on,switch.den_lights,Przełącznik świateł Den,switch.den_lightz,Włącz przełącznik świateł Den,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='switch.den_lightz', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>",Spróbuję ponownie z prawidłowym przełącznikiem.
|
||||
blinds.stop_cover,blinds.piwnica,Żaluzje piwniczne,blinds.piwnicza,Zatrzymaj żaluzje w piwnicy.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='blinds.piwnicza', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>",Spróbuję ponownie z urządzeniem blinds.piwnica.
|
||||
switch.turn_on,switch.oświetlenie_pokoju_dziennego,Przełącznik oświetlenia w salonie,switch.oświetlenie_pokoju_dziennego_extra,"Włącz oświetlenie w salonie, proszę.","<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='switch.oświetlenie_pokoju_dziennego_extra', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>",Spróbuję włączyć właściwy przełącznik oświetlenia w salonie.
|
||||
lock.unlock,lock.yale_living,Pokój dzienny Yale,lock.yale_livng,Odblokuj drzwi w pokoju dziennym.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='lock.yale_livng', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>",Już próbuję z prawidłowym urządzeniem lock.yale_living.
|
||||
switch.turn_on,switch.oświetlenie_biurowe,Włącznik świateł biurowych,switch.oświetlenie_biuro,Proszę włącz światła w biurze,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='switch.oświetlenie_biuro', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>",Spróbuję ponownie z właściwym przełącznikiem.
|
||||
lock.lock,lock.jadalnia,Zamek do jadalni,lock.jadalniak,Zamknij zamek w jadalni.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='lock.jadalniak', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>",Już próbuję ponownie z właściwym urządzeniem lock.jadalnia.
|
||||
media_player.volume_up,media_player.ps5_living_room,Salon PS5,media_player.ps5_salon_room,Zwiększ głośność w salonie PS5.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='media_player.ps5_salon_room', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>",Już próbuję z właściwym urządzeniem.
|
||||
media_player.media_play_pause,media_player.strumień_laptopa,Laptop do transmisji strumieniowej,media_player.laptop_strumień,Wstrzymaj odtwarzanie na Laptopie do transmisji strumieniowej.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='media_player.laptop_strumień', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>",Już próbuję z właściwym urządzeniem: media_player.strumień_laptopa.
|
||||
climate.set_temperature,climate.termostat_lux_geo,Termostat Lux Geo Wi-Fi,climate.lux_termostat_geo,Ustaw temperaturę na <temp_f> stopni.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='climate.lux_termostat_geo', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>",Już próbuję z Termostatem Lux Geo.
|
||||
fan.turn_on,fan.żłobek,Wentylatpor w żlobku,fan.żłobek_sala,"Włącz wentylator w żłobku, proszę.","<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='fan.żłobek_sala', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>",Już próbuję włączyć wentylator w żłobku.
|
||||
garage_door.open_cover,garage_door.sprzęt_trawnikowy,Drzwi do sprzętu trawnikowego,garage_door.trawnikowy_sprzęt,Otwórz pokrywę drzwi do sprzętu trawnikowego,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='garage_door.trawnikowy_sprzęt', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>",Spróbuję ponownie z właściwym urządzeniem.
|
||||
vacuum.stop,vacuum.salon_pokój_pokojowy,Odkurzacz w salonie,vacuum.salon_pokój,Zatrzymaj odkurzacz w salonie.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='vacuum.salon_pokój', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>",Spróbuję ponownie z odkurzaczem w salonie (vacuum.salon_pokój_pokojowy).
|
||||
lock.lock,lock.boczna_brama,Zamek bramy bocznej,lock.boczna_brama_s,Zamknij bramę boczną.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='lock.boczna_brama_s', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>",Spróbuję ponownie z zamkiem bramy bocznej.
|
||||
garage_door.toggle,garage_door.wózek_golfowy,Drzwi do wózka golfowego,garage_door.wózek_golf,Przełącz drzwi do wózka golfowego.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='garage_door.wózek_golf', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>",Już próbuję z urządzeniem garage_door.wózek_golfowy.
|
||||
fan.toggle,fan.mistrz_kąpiel,Główny wentylator łazienkowy,fan.mistrz_kąpielowy,Włącz główny wentylator łazienkowy,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='fan.mistrz_kąpielowy', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>",Spróbuję ponownie z właściwym wentylatorem.
|
||||
switch.toggle,switch.światła_pokoju_zabaw,Przełącznik oświetlenia pokoju zabaw,switch.światła_pokoju_zaba,Przełącz światła w pokoju zabaw.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='switch.światła_pokoju_zaba', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>",Spróbuję ponownie z właściwym przełącznikiem.
|
||||
blinds.stop_cover,blinds.korytarz_1,Pierwsze rolety w przedpokoju,blinds.korytarz_1a,Zatrzymaj rolety w przedpokoju,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='blinds.korytarz_1a', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>",Spróbuję ponownie z właściwym urządzeniem.
|
||||
light.toggle,light.parter_balkon_mqtt,Światło na balkonie na dole,light.parterbalkon_mqtt,Włącz światło na balkonie na dole,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='light.parterbalkon_mqtt', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>",Już próbuję ponownie z prawidłowym urządzeniem.
|
||||
switch.turn_off,switch.oświetlenie_poddasza,Przełącznik oświetlenia na poddaszu,switch.oświetlenie_poddasza_ekstra,Wyłącz oświetlenie na poddaszu,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='switch.oświetlenie_poddasza_ekstra', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>",Już próbuję wyłączyć przełącznik oświetlenia na poddaszu.
|
||||
switch.turn_off,switch.otwieracz_drzwi_garażowych,Włącznik otwierania drzwi garażowych,switch.drzwi_otwieracz_garażowych,Wyłącz włącznik otwierania drzwi garażowych,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='switch.drzwi_otwieracz_garażowych', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>",Spróbuję wyłączyć właściwy przełącznik.
|
||||
media_player.volume_down,media_player.bang_olufsen_beovision,Wysokiej klasy telewizor B&O,media_player.bang_olufsen_beovision_tv,Ścisz głośność w telewizorze Bang & Olufsen.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='media_player.bang_olufsen_beovision_tv', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>",Już próbuję z właściwym urządzeniem media_player.bang_olufsen_beovision.
|
||||
switch.toggle,switch.światła_pokładowe,Przełącznik oświetlenia pokładu,switch.światła_pokładowe_extra,Przełącz oświetlenie pokładowe.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='switch.światła_pokładowe_extra', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>",Już próbuję ponownie z przełącznikiem oświetlenia pokładowego.
|
||||
fan.toggle,fan.łazienka_w_dół,Wentylator w łazience na parterze,fan.łazienka_w_górę,Włącz wentylator w łazience na parterze,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='fan.łazienka_w_górę', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>",Spróbuję ponownie z właściwym urządzeniem.
|
||||
garage_door.toggle,garage_door.strona_2,Boczna brama garażowa,garage_door.strona_2_extra,Przełącz boczną bramę garażową,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='garage_door.strona_2_extra', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>",Już próbuję z prawidłowym urządzeniem garage_door.strona_2.
|
||||
climate.turn_off,climate.kono_termostat,Inteligentny termostat Kono,climate.kono_termostat_v2,Wyłącz inteligentny termostat Kono,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='climate.kono_termostat_v2', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>",Spróbuję ponownie z właściwym termostatem (climate.kono_termostat).
|
||||
fan.decrease_speed,fan.poddasze_1,Wentylator na poddaszu,fan.poddasze_1,"Proszę, zmniejsz prędkość wentylatora na poddaszu.","<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='fan.poddasze_1', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>",Już próbuję z właściwym urządzeniem Wentylator na poddaszu.
|
||||
fan.turn_on,fan.korytarz,Wentylator w przedpokoju,fan.korytar,Proszę włącz wentylator w przedpokoju.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='fan.korytar', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>",Spróbuję włączyć właściwy wentylator w przedpokoju.
|
||||
fan.decrease_speed,fan.mistrz_kąpiel,Główny wentylator łazienkowy,fan.mistrz_kąpiel_łazienka,"Proszę, zmniejsz prędkość wentylatora.","<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='fan.mistrz_kąpiel_łazienka', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>",Już próbuję z właściwym wentylatorem.
|
||||
switch.toggle,switch.oświetlenie_tarasu,Sterowanie oświetleniem tarasu,switch.oświetlenie_tarasu_2,"Włącz oświetlenie tarasu, proszę.","<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='switch.oświetlenie_tarasu_2', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>",Już próbuję z właściwym urządzeniem (switch.oświetlenie_tarasu).
|
||||
switch.turn_off,switch.światła_pokładowe,Przełącznik oświetlenia pokładu,switch.światła_pokładowe_backup,"Wyłącz światła pokładowe, proszę.","<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='switch.światła_pokładowe_backup', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>",Już próbuję wyłączyć prawidłowy przełącznik.
|
||||
fan.toggle,fan.strych,Wentylator na strychu,fan.strychx,Przełącz wentylator na strychu.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='fan.strychx', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>",Już próbuję z właściwym wentylatorem (fan.strych).
|
||||
light.turn_on,light.góra_szafa_zwave,Światło w szafie na górze,light.góra_szafa_zwave_extra,Włącz światło w szafie na górze na 99% jasności i ustaw kolor na czerwony.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='light.góra_szafa_zwave_extra', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>",Spróbuję jeszcze raz z prawidłowym urządzeniem light.góra_szafa_zwave.
|
||||
lock.unlock,lock.warsztat,Zamek warsztatowy,lock.warsztatowy,Odblokuj zamek warsztatowy,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='lock.warsztatowy', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>",Spróbuję ponownie z urządzeniem lock.warsztat.
|
||||
vacuum.return_to_base,vacuum.piwnica_deebot,Deebot z piwnicy,vacuum.piwnica_deebot_extra,"Deebot, wróć do bazy.","<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='vacuum.piwnica_deebot_extra', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>",Spróbuję ponownie z prawidłowym odkurzaczem Deebot z piwnicy.
|
||||
climate.turn_off,climate.honeywell_lyric_t6,Honeywell Lyric T6 Pro,climate.honeywell_lyric_t6_pro,Wyłącz klimatyzację w salonie.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='climate.honeywell_lyric_t6_pro', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>",Już próbuję z właściwym urządzeniem.
|
||||
light.turn_on,light.garaż_workbench_cool,Stół warsztatowy w garażu zimne światło,light.garaż_workbench_cool_plus,Włącz zimne światło przy stole warsztatowym w garażu.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='light.garaż_workbench_cool_plus', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>",Już próbuję włączyć właściwe światło przy stole warsztatowym.
|
||||
climate.turn_off,climate.tado_smart,Inteligentny termostat Tado,climate.tado_smar,Wyłącz ogrzewanie w całym domu.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='climate.tado_smar', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>",Już próbuję wyłączyć termostat Tado.
|
||||
blinds.close_cover,blinds.pokój_dziecięcy,Rolety w pokoju dziecięcym,blinds.pokój_dziec,Zamknij rolety w pokoju dziecięcym.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='blinds.pokój_dziec', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>",Spróbuję ponownie z Rolety w pokoju dziecięcym.
|
||||
lock.unlock,lock.szopa_na_narzędzia,Zamek szopy na narzędzia,lock.szopa_na_narzędziów,Odblokuj zamek szopy na narzędzia,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='lock.szopa_na_narzędziów', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>",Spróbuję ponownie z właściwym zamkiem.
|
||||
fan.turn_on,fan.honeywell_turbo,Turbowentylator Honeywell,fan.turbo_honeywell,Włącz proszę turbowentylator Honeywell,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='fan.turbo_honeywell', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>",Już próbuję włączyć Turbowentylator Honeywell.
|
||||
light.turn_on,light.kuchnia_2,Drugie światło kuchenne,light.kuchnia_2_extra,Proszę włączyć drugie światło kuchenne na 20% jasności.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='light.kuchnia_2_extra', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>",Już próbuję włączyć właściwe światło kuchenne.
|
||||
fan.decrease_speed,fan.kuchnia,Wenty w kuchni,fan.kuchniak,"Proszę, zmniejsz prędkość wentylatora w kuchni.","<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='fan.kuchniak', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>",Już poprawiam i użyję fan.kuchnia.
|
||||
switch.turn_off,switch.water_feature_lights,Przełącznik świateł funkcji wodnej,switch.water_feat_lights,Wyłącz proszę światła w funkcji wodnej.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='switch.water_feat_lights', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>",Już próbuję wyłączyć właściwe urządzenie: switch.water_feature_lights.
|
||||
light.turn_off,light.badanie_3,Światła do nauki,light.badanie_33,Wyłącz światła do nauki,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='light.badanie_33', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>",Spróbuję wyłączyć właściwe światło: Światła do nauki.
|
||||
switch.toggle,switch.oświetlenie_patia,Przełącznik oświetlenia patio,switch.oświetlenie_pat,Przełącz światło na patio,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='switch.oświetlenie_pat', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>",Już próbuję z prawidłowym urządzeniem switch.oświetlenie_patia.
|
||||
fan.decrease_speed,fan.salon_pokoju_centrum,Centralny wentylator do salonu,fan.salon_pokój_centrum,"Proszę, zmniejsz prędkość wentylatora w salonie.","<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='fan.salon_pokój_centrum', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>",Już próbuję z właściwym urządzeniem fan.salon_pokoju_centrum.
|
||||
light.turn_off,light.przód_kominek_homekit,Przednia lampa kominkowa,light.przód_kominek_homekit_backup,Wyłącz proszę przednią lampę kominkową.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='light.przód_kominek_homekit_backup', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>",Już próbuję wyłączyć lampę przy użyciu właściwego urządzenia.
|
||||
vacuum.start,vacuum.master_bedroom_shark,Odkurzacz w głównej sypialni,vacuum.master_bedroom_shark_pro,Proszę uruchomić odkurzacz w głównej sypialni.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='vacuum.master_bedroom_shark_pro', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>",Już próbuję ponownie z właściwym odkurzaczem.
|
||||
garage_door.close_cover,garage_door.zapasowy,Zapasowe drzwi garażowe,garage_door.zapasow,Zamknij pokrywę drzwi garażowych.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='garage_door.zapasow', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>",Spróbuję ponownie z urządzeniem garage_door.zapasowy.
|
||||
media_player.turn_on,media_player.ps5_living_room,Salon PS5,media_player.ps5_salon_room,Włącz Salon PS5.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='media_player.ps5_salon_room', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>",Spróbuję ponownie z właściwym urządzeniem.
|
||||
fan.decrease_speed,fan.salon_2,Wentylator do salonu,fan.salon2,Proszę zmniejszyć prędkość wentylatora w salonie.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='fan.salon2', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>",Spróbuję ponownie z właściwym wentylatorem (fan.salon_2).
|
||||
lock.unlock,lock.jadalnia,Zamek do jadalni,lock.jadlania,"Odblokuj zamek w jadalni, proszę.","<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='lock.jadlania', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>",Spróbuję ponownie z prawidłowym urządzeniem (lock.jadalnia).
|
||||
media_player.turn_on,media_player.panasonic_4k_bluray_player,Odtwarzacz Blueray Panasonic,media_player.panasonic_4k_bluray_player_v2,Włącz odtwarzacz Blu-ray Panasonic.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='media_player.panasonic_4k_bluray_player_v2', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>",Spróbuję ponownie z właściwym odtwarzaczem.
|
||||
garage_door.stop_cover,garage_door.wyższy_poziom,Garaż na górnym poziomie,garage_door.wyższypoziom,Zatrzymaj drzwi garażowe na górnym poziomie.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='garage_door.wyższypoziom', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>",Już próbuję z prawidłowym urządzeniem.
|
||||
climate.turn_on,climate.emerson_sensi_touch,Termostat Wi-Fi Emerson Sensi Touch,climate.emerson_sensi_tuch,Włącz termostat Emerson Sensi Touch.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='climate.emerson_sensi_tuch', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>",Spróbuję ponownie z właściwym urządzeniem.
|
||||
media_player.volume_up,media_player.telewizor_apple,Odtwarzacz multimedialny Apple TV,media_player.telewizor_apple_tv,Zwiększ głośność odtwarzacza multimedialnego Apple TV.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='media_player.telewizor_apple_tv', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>",Spróbuję ponownie z odtwarzaczem multimedialnym Apple TV.
|
||||
climate.turn_off,climate.termostat_lux_geo,Termostat Lux Geo Wi-Fi,climate.lux_geo_termostat,Wyłącz termostat Lux Geo Wi‑Fi.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='climate.lux_geo_termostat', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>",Już próbuję wyłączyć właściwy termostat (climate.termostat_lux_geo).
|
||||
media_player.volume_down,media_player.strumień_laptopa,Laptop do transmisji strumieniowej,media_player.strumień_lapto,Ścisz odtwarzacz na laptopie do transmisji strumieniowej.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='media_player.strumień_lapto', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>",Już próbuję ponownie z media_player.strumień_laptopa.
|
||||
garage_door.toggle,garage_door.wózek_golfowy,Drzwi do wózka golfowego,garage_door.golfowy_wózek,"Otwórz drzwi do wózka golfowego, proszę.","<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='garage_door.golfowy_wózek', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>",Już próbuję z prawidłowym urządzeniem.
|
||||
lock.lock,lock.szafka_na_akta,Zamek szafki na dokumenty,lock.szacka_na_akta,Zamknij szafkę na dokumenty,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='lock.szacka_na_akta', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>",Spróbuję ponownie z właściwym zamkiem: lock.szafka_na_akta.
|
||||
switch.turn_on,switch.światła_pokładowe,Przełącznik oświetlenia pokładu,switch.światła_pokładowe_kontrola,"Włącz oświetlenie pokładu, proszę.","<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='switch.światła_pokładowe_kontrola', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>",Spróbuję ponownie z właściwym przełącznikiem oświetlenia pokładu.
|
||||
garage_door.toggle,garage_door.wasztat,Warsztatowa brama garażowa,garage_door.waztast,Zamknij warsztatową bramę garażową.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='garage_door.waztast', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>",Spróbuję jeszcze raz z prawidłowym urządzeniem.
|
||||
fan.turn_off,fan.pokój_gościnny,Wentylator w pokoju gościnnym,fan.pokój_gościnny_v2,Wyłącz wentylator w pokoju gościnnym.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='fan.pokój_gościnny_v2', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>",Już próbuję wyłączyć wentylator w pokoju gościnnym.
|
||||
lock.lock,lock.garderoba,Zamek do garderoby,lock.garderoba_door,Zamknij zamek w garderobie.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='lock.garderoba_door', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>",Spróbuję ponownie z urządzeniem lock.garderoba.
|
||||
blinds.open_cover,blinds.korytarz_1,Pierwsze rolety w przedpokoju,blinds.korytarz_1a,Otwórz proszę pierwsze rolety w przedpokoju,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='blinds.korytarz_1a', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>",Spróbuję ponownie z prawidłowym urządzeniem.
|
||||
switch.turn_off,switch.światła_podjazdu,Przełącznik oświetleniem podjazdu,switch.światła_podjazd,"Wyłącz oświetlenie podjazdu, proszę.","<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='switch.światła_podjazd', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>",Już próbuję wyłączyć prawidłowy przełącznik: switch.światła_podjazdu.
|
||||
media_player.volume_down,media_player.garaż,Garażowy odtwarzacz multimedialny,media_player.garaż_ekstra,Obniż głośność w garażowym odtwarzaczu multimedialnym.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='media_player.garaż_ekstra', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>",Już próbuję z właściwym urządzeniem media_player.garaż.
|
||||
light.toggle,light.badanie_1,Światła do nauki,light.badanie,Przełącz światła do nauki,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='light.badanie', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>",Spróbuję ponownie z właściwym urządzeniem: light.badanie_1.
|
||||
climate.turn_on,climate.trane_comfortlink_ii,Trane ComfortLink II XL1050,climate.trane_comfortlink,Włącz system klimatyzacji Trane w domu,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='climate.trane_comfortlink', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>",Już próbuję z właściwym urządzeniem: climate.trane_comfortlink_ii.
|
||||
switch.toggle,switch.łazienka_wentylator,Przełącznik wentylatora łazienkowego,switch.wentylator_łazienka,Włącz wentylator w łazience,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='switch.wentylator_łazienka', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>",Już próbuję z właściwym przełącznikiem.
|
||||
lock.unlock,lock.pomieszczenie_gospodarcze,Zamek pomieszczenia gospodarczego,lock.pomieszczenie_gosp,Odblokuj zamek pomieszczenia gospodarczego.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='lock.pomieszczenie_gosp', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>",Już próbuję odblokować Zamek pomieszczenia gospodarczego.
|
||||
climate.turn_off,climate.przewoźnik_kor,Termostat Carrier Cor Wi-Fi,climate.przewoźnik_korX,Wyłącz termostat Carrier Cor Wi‑Fi,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='climate.przewoźnik_korX', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>",Spróbuję jeszcze raz z właściwym urządzeniem.
|
||||
lock.unlock,lock.joga_pokój,Zamek do pokoju jogi,lock.joga-pokój,Odblokuj zamek w pokoju jogi.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='lock.joga-pokój', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>",Spróbuję ponownie z właściwym urządzeniem lock.joga_pokój.
|
||||
switch.turn_off,switch.pompa_basenu,Przełącznik pompy basenowej,switch.pompa_basen,Wyłącz przełącznik pompy basenowej,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='switch.pompa_basen', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>",Spróbuję ponownie z właściwym przełącznikiem pompy basenowej.
|
||||
lock.unlock,lock.przód_drzwi_1,Główny zamek wejściowy,lock.przód_drzwi_one,Odblokuj główny zamek wejściowy.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='lock.przód_drzwi_one', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>",Już próbuję z prawidłowym urządzeniem lock.przód_drzwi_1.
|
||||
vacuum.stop,vacuum.under_bed_cleaner,Odkurzacz pod łóżkiem,vacuum.under_bed_cleaner_extra,"Zatrzymaj odkurzacz pod łóżkiem, proszę.","<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='vacuum.under_bed_cleaner_extra', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>",Już próbuję z odkurzaczem pod łóżkiem.
|
||||
light.toggle,light.piętro_poddasze_zwave,Światło na poddaszu na piętrze,light.poddasze_piętro_zwave,Włącz światło na poddaszu na piętrze,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='light.poddasze_piętro_zwave', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>",Już próbuję z prawidłowym urządzeniem.
|
||||
media_player.volume_down,media_player.soundbar_living_room,Soundbar do salonu,media_player.soundbars_living_room,Ścisz dźwięk na soundbarze w salonie.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='media_player.soundbars_living_room', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>",Spróbuję ponownie z właściwym urządzeniem Soundbar do salonu.
|
||||
light.turn_on,light.garaż,Światło w garażu,light.garażek,Włącz proszę światło w garażu.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='light.garażek', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>",Już poprawiam i włączam światło w garażu.
|
||||
fan.increase_speed,fan.sypialnia_mistrz,Wentylator w głównej sypialni,fan.sypialnia_mistrz_2,Zwiększ prędkość wentylatora w głównej sypialni.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='fan.sypialnia_mistrz_2', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>",Już próbuję z właściwym wentylatorem.
|
||||
fan.turn_on,fan.sufit_1,Wentylatory sufitowe,fan.sufit_one,Włącz proszę wentylatory sufitowe,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='fan.sufit_one', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>",Już próbuję włączyć właściwy wentylator sufitowy.
|
||||
media_player.volume_up,media_player.roku_living,Pokój dzienny Roku,media_player.roku_livingz,Zwiększ głośność w pokoju dziennym Roku,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='media_player.roku_livingz', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>",Spróbuję ponownie z prawidłowym urządzeniem.
|
||||
climate.turn_on,climate.trane_comfortlink_ii,Trane ComfortLink II XL1050,climate.trane_comfortlink_ii_extra,Włącz klimatyzację w salonie.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='climate.trane_comfortlink_ii_extra', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>",Już próbuję włączyć Trane ComfortLink II.
|
||||
garage_door.open_cover,garage_door.szopa_1,Pierwsze drzwi do szopy,garage_door.szopa_12,Otwórz pokrywę pierwszych drzwi do szopy.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='garage_door.szopa_12', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>",Już próbuję z prawidłowym urządzeniem garage_door.szopa_1.
|
||||
media_player.turn_off,media_player.roku_sypialnia,Odtwarzacz Roku w sypialni,media_player.roku_sypialnia_tv,Wyłącz odtwarzacz Roku w sypialni.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='media_player.roku_sypialnia_tv', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>",Już próbuję wyłączyć Odtwarzacz Roku w sypialni.
|
||||
fan.decrease_speed,fan.strych,Wentylator na strychu,fan.rysch,Zmniejsz prędkość wentylatora na strychu.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='fan.rysch', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","OK, spróbuję ponownie z właściwym urządzeniem (fan.strych)."
|
||||
switch.turn_on,switch.spiżarnia_światła,Przełącznik świateł w spiżarni,switch.spiżarnia_światła_v2,Włącz proszę światła w spiżarni.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='switch.spiżarnia_światła_v2', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>",Spróbuję ponownie z prawidłowym przełącznikiem – switch.spiżarnia_światła.
|
||||
lock.lock,lock.studio,Zamek studyjna,lock.studi,Zamknij zamek studyjną.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='lock.studi', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>",Już próbuję z właściwym zamkiem (lock.studio).
|
||||
lock.unlock,lock.warsztat_szafka,Zamek do szafki warsztatowej,lock.warsztat_szafk,Odblokuj zamek do szafki warsztatowej.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='lock.warsztat_szafk', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>",Już próbuję z właściwym zamkiem (lock.warsztat_szafka).
|
||||
blinds.close_cover,blinds.pokój_dziecięcy,Rolety w pokoju dziecięcym,blinds.pokój_dzieci,Zamknij rolety w pokoju dziecięcym.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='blinds.pokój_dzieci', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>",Już próbuję z roletami w pokoju dziecięcym.
|
||||
lock.unlock,lock.kino_domowe,Zamek kina domowego,lock.kino_domow,Odblokuj zamek kina domowego.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='lock.kino_domow', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>",Już próbuję z właściwym urządzeniem lock.kino_domowe.
|
||||
climate.turn_on,climate.sinope_smart,Inteligentny termostat Sinopé,climate.sinop_smart,Włącz ogrzewanie w domu,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='climate.sinop_smart', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>",Już próbuję włączyć Inteligentny termostat Sinopé.
|
||||
light.toggle,light.ganek,Światło na ganku,light.gank,Przełącz światło na ganku,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='light.gank', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>",Spróbuję ponownie z prawidłowym urządzeniem.
|
||||
fan.turn_off,fan.ganek,Wentylator na werandzie,fan.gane,Proszę wyłącz wentylator na werandzie.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='fan.gane', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>",Spróbuję ponownie z właściwym urządzeniem (fan.ganek).
|
||||
garage_door.open_cover,garage_door.magazyn_rowerów,Garaż do przechowywania rowerów,garage_door.magazyn_rower,Proszę otworzyć pokrywę garażu do przechowywania rowerów.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='garage_door.magazyn_rower', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Przepraszam, spróbuję ponownie z właściwym urządzeniem."
|
||||
|
124
data/piles/polish/pile_of_refusals.csv
Normal file
124
data/piles/polish/pile_of_refusals.csv
Normal file
@@ -0,0 +1,124 @@
|
||||
reason_type,service_name,device_name,friendly_name,desired_state,phrase,response
|
||||
not_available,lock.lock,back_door,Zamek tylnych drzwi,,"Zablokuj <device_name>.","Nie mogę znaleźć zamka tylnych drzwi do sterowania."
|
||||
already_state,light.turn_on,hallway,Światła w korytarzu,on,"Włącz <device_name>.","Światła w korytarzu są już włączone."
|
||||
already_state,switch.turn_off,garage,Gniazdko w garażu,off,"Wyłącz <device_name>.","Gniazdko w garażu jest już wyłączone."
|
||||
already_state,vacuum.start,kitchen_xiaomi,Odkurzacz Kuchenny,cleaning,Uruchom <device_name>,"Odkurzacz już sprząta, nie muszę nic zmieniać."
|
||||
not_available,climate.turn_off,tado_smart,Inteligentny termostat Tado,,Wyłącz <device_name>,"Przepraszam, nie mogę znaleźć tego urządzenia w domu."
|
||||
not_available,fan.decrease_speed,sypialnia_prawa,Wentylator w sypialni po prawej stronie,,Zmniejsz prędkość <device_name>,"Przepraszam, nie mogę znaleźć tego urządzenia w domu."
|
||||
not_available,lock.lock,strych,Zamek na poddaszu,,Zamknij <device_name>,"Przepraszam, nie mogę tego zrobić, ponieważ nie mogę znaleźć tego urządzenia w domu."
|
||||
already_state,light.turn_off,kuchnia_sufit_cool,Chłodne światło sufitowe w kuchni,off,Wyłącz <device_name>,"Światło już jest wyłączone, więc nie ma potrzeby zmiany."
|
||||
already_state,light.turn_on,jadalnia_żyrandol,Żyrandol do jadalni,on,Włącz <device_name>,"Światło już jest włączone, nie trzeba nic zmieniać."
|
||||
already_state,switch.turn_on,spiżarnia_światła,Przełącznik świateł w spiżarni,on,Włącz <device_name>,"Nie mogę, <device_name> jest już włączone."
|
||||
not_available,climate.turn_on,emerson_sensi_touch,Termostat Wi-Fi Emerson Sensi Touch,,Włącz <device_name>,"Przepraszam, nie mogę znaleźć tego urządzenia w domu."
|
||||
not_available,lock.unlock,szopa_na_narzędzia,Blokada szopy na narzędzia,,Odblokuj <device_name>,"Przepraszam, nie mogę znaleźć tego urządzenia w domu."
|
||||
not_available,fan.turn_on,patio_na_świeżym_powietrzu,Wentylator ogrodowy,,Włącz <device_name>,"Przepraszam, nie mogę znaleźć tego urządzenia w domu."
|
||||
already_state,light.turn_on,patio,Światło tarasowe,on,Włącz <device_name> na 30% jasności,"Światło już jest włączone, nie ma potrzeby zmiany jasności."
|
||||
not_available,blinds.toggle,żłobek,Rolety w żlobku,,Zamknij <device_name>,"Przepraszam, nie mogę znaleźć tego urządzenia w domu."
|
||||
not_available,media_player.turn_on,google_nest_hub,Google nest hub,,Włącz <device_name>,"Przepraszam, nie mogę znaleźć tego urządzenia w domu."
|
||||
not_available,climate.set_temperature,tado_smart,Inteligentny termostat Tado,,Ustaw temperaturę <device_name> na 28 stopni,"Nie mogę znaleźć <device_name> w domu, więc nie mogę zmienić temperatury."
|
||||
not_available,media_player.turn_off,apple_tv_4k,Urządzenie Apple do przesyłania strumieniowego,,Wyłącz <device_name>,"Przepraszam, nie mogę znaleźć tego urządzenia w domu."
|
||||
not_available,media_player.volume_up,roku_living,Pokój dzienny Roku,,Zwiększ głośność <device_name>,"Nie mogę tego zrobić, ponieważ nie znalazłem urządzenia <device_name> w domu."
|
||||
already_state,switch.turn_off,oświetlenie_szafy,Przełącznik oświetleniem szafy,off,Wyłącz <device_name>,"Urządzenie jest już wyłączone, więc nie muszę nic zmieniać."
|
||||
not_available,media_player.volume_up,chrome_cast_sypialnia,Chromecast w sypialni,,Zwiększ głośność <device_name>,"Przepraszam, nie mogę znaleźć urządzenia <device_name> w domu."
|
||||
not_available,media_player.turn_on,telewizor_samsung,Telewizor w salonie,,Włącz <device_name>,"Przepraszam, nie mogę znaleźć tego urządzenia w domu."
|
||||
not_available,vacuum.return_to_base,under_bed_cleaner,Odkurzacz pod łóżkiem,,Proszę <device_name> wrócić do bazy.,"Przepraszam, nie mogę znaleźć <device_name> w domu."
|
||||
not_available,climate.turn_off,johnson_glas,Johnson steruje inteligentnym termostatem GLAS,,Wyłącz <device_name>,"Przepraszam, nie mogę znaleźć tego urządzenia w domu."
|
||||
already_state,garage_door.open_cover,wózek_golfowy,Garaż wózków golfowych,open,otwórz pokrywę <device_name>,"Nie mogę tego zrobić – pokrywa już jest otwarta, więc nie ma potrzeby żadnej zmiany."
|
||||
not_available,switch.toggle,master_bedroom_lights,Główny włącznik świateł w sypialni,,Przełącz <device_name>,"Przepraszam, nie mogę znaleźć tego urządzenia w domu."
|
||||
not_available,garage_door.open_cover,jeden_samochód,Pojedyncze drzwi garażowe,,Otwórz pokrywę <device_name>,"Przepraszam, nie mogę znaleźć tego urządzenia w domu."
|
||||
not_available,fan.turn_on,patio,Wentylator tarasowy,,Włącz <device_name>,"Przepraszam, nie mogę znaleźć tego urządzenia w domu."
|
||||
not_available,fan.decrease_speed,jadalnia,Wentylator w jadalni,,Zmniejsz prędkość <device_name>,"Przepraszam, nie mogę znaleźć tego urządzenia w domu."
|
||||
not_available,switch.toggle,oświetlenie_teatra_domowego,Sterowanie oświetleniem kina domowego,,Przełącz <device_name>,"Przepraszam, nie mogę znaleźć <device_name> w domu."
|
||||
already_state,climate.turn_on,sinope_smart,Inteligentny termostat Sinopé,on,Włącz <device_name>,"Urządzenie już jest włączone, nie ma potrzeby zmiany."
|
||||
not_available,light.toggle,kuchnia_1,Główne światło kuchenne,,Przełącz <device_name>,"Przepraszam, nie mogę znaleźć urządzenia <device_name> w Twoim domu."
|
||||
not_available,fan.decrease_speed,badanie_1,Miłośnik nauki,,Zmniejsz prędkość <device_name>,"Przepraszam, nie mogę znaleźć tego urządzenia w domu."
|
||||
already_state,climate.turn_off,ecobee_smart,Inteligentny termostat Ecobee,off,Wyłącz <device_name>,"Nie mogę, ponieważ <device_name> jest już wyłączony i nie wymaga zmiany."
|
||||
not_available,vacuum.return_to_base,kitchen_xiaomi,Odkurzacz Kuchenny,,Zwróć <device_name> do bazy,"Przepraszam, nie mogę znaleźć tego urządzenia w domu."
|
||||
not_available,fan.increase_speed,szopa,Wentylator szopy,,Zwiększ prędkość <device_name>,"Przepraszam, nie mogę znaleźć tego urządzenia w domu."
|
||||
not_available,lock.lock,przódowa_brama,Zamek bramy przedniej,,Zamknij <device_name>,"Przepraszam, nie mogę znaleźć tego urządzenia w domu."
|
||||
not_available,blinds.toggle,somfy_salon,Rolety w salonie,,Przełącz <device_name>,"Przepraszam, nie mogę znaleźć tego urządzenia w domu."
|
||||
not_available,vacuum.start,under_bed_cleaner,Odkurzacz pod łóżkiem,,Uruchom <device_name>,"Przepraszam, nie mogę znaleźć tego urządzenia w domu."
|
||||
already_state,climate.turn_on,mysa_smart_termostat,Inteligentny termostat Mysa do elektrycznych grzejników listwowych,on,Włącz <device_name>,"Już jest włączone, nie muszę nic zmieniać."
|
||||
not_available,media_player.volume_down,projektor_sony_4k,Projektor do kina domowego Sony,,Obniż głośność <device_name>,"Przepraszam, nie mogę znaleźć urządzenia <device_name> w domu."
|
||||
not_available,blinds.open_cover,okno_biura,Żaluzje w biurze,,Otwórz <device_name>,"Przepraszam, nie mogę znaleźć tego urządzenia w domu."
|
||||
not_available,switch.turn_off,łazienka_wentylator,Przełącznik wentylatora łazienkowego,,Wyłącz <device_name>,"Przepraszam, nie mogę znaleźć tego urządzenia w domu."
|
||||
not_available,fan.toggle,poddasze_3,Wentylator na poddaszu,,Przełącz <device_name>,Niestety nie mogę zlokalizować tego urządzenia w domu.
|
||||
not_available,media_player.volume_down,biuro,Biurowy odtwarzacz multimedialny,,Obniż głośność <device_name>,"Przepraszam, nie mogę znaleźć urządzenia <device_name> w domu."
|
||||
not_available,switch.toggle,światła_chodnika,Przełącznik świateł chodnikowych,,Przełącz <device_name>,"Przepraszam, nie mogę znaleźć tego urządzenia w domu."
|
||||
not_available,lock.unlock,jadalnia,Zamek do jadalni,,Odblokuj <device_name>,Nie mogę znaleźć <device_name> w domu.
|
||||
not_available,fan.toggle,sypialnia_prawa,Wentylator w sypialni po prawej stronie,,Przełącz <device_name>,"Przepraszam, nie mogę znaleźć tego urządzenia w domu."
|
||||
not_available,climate.set_temperature,termostat_lux_geo,Termostat Lux Geo Wi-Fi,,Ustaw temperaturę <device_name> na 28°C,"Przepraszam, nie mogę znaleźć <device_name> w Twoim domu."
|
||||
not_available,fan.turn_off,patio_na_świeżym_powietrzu,Wentylator ogrodowy,,Wyłącz <device_name>,"Przepraszam, nie mogę znaleźć tego urządzenia w domu."
|
||||
not_available,garage_door.toggle,wasztat,Warsztatowa brama garażowa,,Przełącz <device_name>,"Przepraszam, nie mogę znaleźć tego urządzenia w domu."
|
||||
not_available,fan.increase_speed,łazienka,Wentylator w łazience,,Zwiększ prędkość <device_name>,"Przepraszam, nie mogę znaleźć tego urządzenia w domu."
|
||||
already_state,switch.turn_off,jard_floodlights,Przełącznik reflektorów ogrodowych,off,Wyłącz <device_name>,"Urządzenie już jest wyłączone, nie muszę nic zmieniać."
|
||||
not_available,fan.decrease_speed,sufit_1,Wentylatory sufitowe,,Obniż prędkość <device_name>,"Przepraszam, nie mogę znaleźć <device_name> w domu."
|
||||
not_available,garage_door.toggle,główny,Główna brama garażowa,,Przełącz <device_name>,"Przepraszam, nie mogę znaleźć <device_name> w twoim domu."
|
||||
already_state,garage_door.open_cover,rv_storage,Drzwi do przechowywania samochodu kempingowego,open,Otwórz pokrywę <device_name>,"Brama jest już otwarta, więc nie trzeba nic zmieniać."
|
||||
not_available,lock.unlock,magazyn,Zamek do magazynu,,odblokuj <device_name>,"Przepraszam, nie mogę znaleźć tego urządzenia w domu."
|
||||
not_available,fan.increase_speed,biuro,Wentylator w biurze,,Zwiększ prędkość <device_name>,"Przepraszam, nie mogę znaleźć <device_name> w domu."
|
||||
not_available,blinds.stop_cover,łazienka_1,Pierwsze rolety łazienkowe,,Zatrzymaj <device_name>,"Przepraszam, nie mogę znaleźć tego urządzenia w domu."
|
||||
not_available,switch.turn_off,światła_słoneczne,Przełącznik świateł w pomieszczeniu słonecznym,,Wyłącz <device_name>,"Przepraszam, nie mogę znaleźć tego urządzenia w domu."
|
||||
already_state,switch.turn_on,oświetlenie_patia,Przełącznik oświetlenia patio,on,Włącz <device_name>,"Urządzenie jest już włączone, nie trzeba nic zmieniać."
|
||||
not_available,media_player.volume_up,echo_dot,Kuchenna Echo dot,,Zwiększ głośność <device_name>,"Przepraszam, nie mogę znaleźć <device_name> w domu."
|
||||
already_state,climate.turn_on,tado_smart,Inteligentny termostat Tado,on,Włącz <device_name>,"Urządzenie jest już włączone, nie muszę nic zmieniać."
|
||||
already_state,climate.turn_off,johnson_glas,Johnson steruje inteligentnym termostatem GLAS,off,Wyłącz <device_name>,"Urządzenie już jest wyłączone, więc nie muszę nic zmieniać."
|
||||
not_available,switch.toggle,oświetlenie_przódowe_bramy,Włącznik świateł w bramie przedniej,,Przełącz <device_name>,"Przepraszam, nie mogę znaleźć tego urządzenia w domu."
|
||||
not_available,light.toggle,przód_podwórko_ge,Przednie boczne światło ogrodowe,,Przełącz <device_name>,"Przepraszam, nie mogę znaleźć tego urządzenia w domu."
|
||||
not_available,lock.lock,sypialnia_3,Zamek w trzeciej sypialni,,Zamknij <device_name>,"Przepraszam, nie mogę znaleźć tego urządzenia w domu."
|
||||
already_state,lock.unlock,drzwi_na_patio,Zamek Drzwi przesuwne na taras,unlocked,odblokuj <device_name>,"Ten <device_name> jest już odblokowany, więc nie ma potrzeby zmiany."
|
||||
already_state,light.turn_off,jadalnia,Światło w jadalni,off,Wyłącz <device_name>,"Światło już jest wyłączone, nie muszę nic zmieniać."
|
||||
not_available,garage_door.open_cover,wiata_samochodowa,Drzwi do wiaty,,Otwórz pokrywę <device_name>,"Przepraszam, nie mogę znaleźć tego urządzenia w domu."
|
||||
already_state,garage_door.close_cover,dwa_samochody,Drzwo garażowe podwójne,closed,Zamknij pokrywę <device_name>,"Przykro mi, ale <device_name> jest już zamknięta, więc nie ma potrzeby podejmować żadnej akcji."
|
||||
not_available,garage_door.stop_cover,szopa_2,Drugie drzwi do szopy,,Zatrzymaj <device_name>,"Przepraszam, nie mogę znaleźć tego urządzenia w domu."
|
||||
not_available,blinds.stop_cover,korytarz_1,Pierwsze rolety w przedpokoju,,Zatrzymaj <device_name>,"Przepraszam, nie mogę znaleźć tego urządzenia w domu."
|
||||
not_available,fan.turn_on,kuchnia,Wenty w kuchni,,Włącz <device_name>,"Przepraszam, nie mogę znaleźć tego urządzenia w domu."
|
||||
already_state,climate.turn_on,termostat_lux_geo,Termostat Lux Geo Wi-Fi,on,Włącz <device_name>,"Urządzenie już jest włączone, nie ma potrzeby zmiany."
|
||||
not_available,blinds.stop_cover,solarium,Rolety przeciwsłoneczne,,Zatrzymaj <device_name>,"Przepraszam, nie mogę znaleźć tego urządzenia w domu."
|
||||
not_available,media_player.volume_up,biuro,Biurowy odtwarzacz multimedialny,,Zwiększ głośność <device_name>,"Przepraszam, nie mogę znaleźć urządzenia <device_name> w domu."
|
||||
not_available,lock.lock,pokój_muzyczny,Zamek do pokoju muzycznego,,Zamknij <device_name>,"Przepraszam, nie mogę znaleźć tego urządzenia w domu."
|
||||
not_available,lock.unlock,tylne_drzwi,Zamek wjazdowy na podwórko,,odblokuj <device_name>,"Przepraszam, nie mogę znaleźć tego urządzenia w domu."
|
||||
already_state,switch.turn_off,oświetlenie_ogrodowe,Sterowanie oświetleniem ogrodu,off,Wyłącz <device_name>,"Nie mogę, bo <device_name> jest już wyłączony."
|
||||
already_state,switch.turn_on,oświetlenie_teatra_domowego,Sterowanie oświetleniem kina domowego,on,Włącz <device_name>,"Przepraszam, <device_name> już jest włączony, więc nie muszę nic zmieniać."
|
||||
not_available,garage_door.stop_cover,główny,Główna brama garażowa,,Zatrzymaj <device_name>,"Przepraszam, nie mogę znaleźć tego urządzenia w domu."
|
||||
already_state,vacuum.start,under_bed_cleaner,Odkurzacz pod łóżkiem,cleaning,Uruchom <device_name>,"Odkurzacz już sprząta, nie ma potrzeby go uruchamiać ponownie."
|
||||
already_state,light.turn_off,kuchnia_spiżarnia_fajna,Kuchenna spiżarnia Fajne światło,off,Wyłącz <device_name>,"Nie mogę wyłączyć, <device_name> jest już wyłączone."
|
||||
not_available,vacuum.return_to_base,under_bed_cleaner,Odkurzacz pod łóżkiem,,Zwróć <device_name> do bazy,"Przepraszam, nie mogę znaleźć tego urządzenia w domu."
|
||||
not_available,media_player.volume_down,sonos_living,Salon Sonosa,,Zmniejsz głośność <device_name>,"Przepraszam, nie mogę znaleźć tego urządzenia w domu."
|
||||
not_available,light.turn_off,parter_gabinet_mqtt,Światło w gabinecie na dole,,Wyłącz <device_name>,"Przepraszam, nie mogę znaleźć tego urządzenia w domu."
|
||||
already_state,climate.turn_on,johnson_glas,Johnson steruje inteligentnym termostatem GLAS,on,Włącz <device_name>,"Urządzenie jest już włączone, więc nie trzeba nic zmieniać."
|
||||
already_state,climate.turn_off,gniazdo_learning,Uczący się termostat Nest,off,Wyłącz <device_name>,"Niestety, <device_name> jest już wyłączony, więc nie ma potrzeby nic zmieniać."
|
||||
not_available,media_player.turn_on,sonos_sypialnia,Główna sypialnia Sonos,,Włącz <device_name>,"Przepraszam, nie mogę znaleźć tego urządzenia w domu."
|
||||
not_available,media_player.media_play_pause,kuchnia,Kuchenny odtwarzacz multimedialny,,Zatrzymaj lub odtwórz <device_name>,"Przepraszam, nie mogę znaleźć urządzenia <device_name> w domu."
|
||||
not_available,climate.turn_off,mysa_smart_termostat,Inteligentny termostat Mysa do elektrycznych grzejników listwowych,,Wyłącz <device_name>,"Przepraszam, nie mogę znaleźć tego urządzenia w domu."
|
||||
not_available,garage_door.close_cover,schowek_na_rower,Drzwi do szopy na rowery,,Zamknij <device_name>,"Przepraszam, nie mogę znaleźć tego urządzenia w domu."
|
||||
not_available,fan.increase_speed,salon,Wentylator do salonu,,Zwiększ prędkość <device_name>,"Przepraszam, nie mogę znaleźć <device_name> w domu."
|
||||
not_available,vacuum.stop,under_bed_cleaner,Odkurzacz pod łóżkiem,,Zatrzymaj <device_name>,"Przepraszam, nie mogę znaleźć tego urządzenia w domu."
|
||||
not_available,fan.decrease_speed,sufit_1,Wentylatory sufitowe,,Zmniejsz prędkość <device_name>,"Przepraszam, nie mogę znaleźć tego urządzenia w domu."
|
||||
already_state,climate.turn_off,gniazdo_learning,Uczący się termostat Nest,off,wyłącz <device_name>,"Urządzenie już jest wyłączone, więc nie ma potrzeby żadnej zmiany."
|
||||
not_available,light.turn_on,sypialnia_2,Światło w sypialni,,Włącz <device_name> i ustaw kolor na żółty,"Przepraszam, nie mogę znaleźć tego urządzenia w domu."
|
||||
not_available,switch.toggle,study_room_lights,Przełącznik oświetlenia w pokoju do nauki,,Przełącz <device_name>,Nie mogę znaleźć tego urządzenia w domu.
|
||||
not_available,media_player.volume_down,sonos_beam,Kompaktowy soundbar Sonos,,obniż głośność <device_name>,"Przepraszam, nie mogę znaleźć tego urządzenia w domu."
|
||||
already_state,fan.turn_off,poddasze_1,Wentylator na poddaszu,off,wyłącz <device_name>,"Urządzenie <device_name> jest już wyłączone, więc nie muszę nic zmieniać."
|
||||
already_state,lock.unlock,magazyn,Zamek do magazynu,unlocked,odblokuj <device_name>,"Urządzenie jest już odblokowane, więc nie muszę nic zmieniać."
|
||||
not_available,light.toggle,salon_1,Lampy w salonie,,Przełącz <device_name>,Nie mogę znaleźć tego urządzenia w domu.
|
||||
not_available,lock.lock,drzwi_kuchni,Zamek wejściowy do kuchni,,Zamknij <device_name>,"Przepraszam, nie mogę znaleźć tego urządzenia w domu."
|
||||
not_available,blinds.open_cover,sala_teatralna,Rolety do kina domowego,,Otwórz <device_name>,"Przepraszam, nie mogę znaleźć tego urządzenia w domu."
|
||||
already_state,garage_door.open_cover,rv,Brama garażowa do samochodu kempingowego,open,Otwórz pokrywę <device_name>,"Nie mogę, bo <device_name> jest już otwarty i nie wymaga żadnej zmiany."
|
||||
not_available,garage_door.toggle,dwa_samochody,Drzwo garażowe podwójne,,Przełącz <device_name>,"Przepraszam, nie mogę znaleźć tego urządzenia w domu."
|
||||
already_state,light.turn_off,kuchnia_podłoga_cool,Chłodne światło na podłodze w kuchni,off,wyłącz <device_name>,"Światło już jest wyłączone, więc nie ma potrzeby zmiany."
|
||||
not_available,media_player.volume_up,study_room_audio_book_player,Studiuj odtwarzacz książek audio,,Zwiększ głośność <device_name>,"Przepraszam, nie mogę znaleźć tego urządzenia w domu."
|
||||
already_state,lock.unlock,pokój_zabaw,Zamek do pokoju zabaw,unlocked,odblokuj <device_name>,"Urządzenie jest już odblokowane, więc nie muszę nic zmieniać."
|
||||
not_available,switch.turn_off,oświetlenie_pokoju_pralni,Włącznik oświetlenia w pralni,,Wyłącz <device_name>,"Przepraszam, nie mogę znaleźć tego urządzenia w domu."
|
||||
already_state,vacuum.return_to_base,salon_pokój_pokojowy,Odkurzacz w salonie,docked,"Proszę, <device_name> wróć do bazy","Odkurzacz już jest w stacji dokującej, więc nie muszę nic zmieniać."
|
||||
already_state,vacuum.return_to_base,przód_hall_samsung,Robot zamiatający przedpokój,docked,"Proszę, aby <device_name> wrócił do bazy","Odkurzacz już jest w stacji dokującej, więc nie ma potrzeby żadnej akcji."
|
||||
not_available,switch.toggle,oświetlenie_przódowe_bramy,Włącznik świateł w bramie przedniej,,Przełącz <device_name>,"Przepraszam, nie mogę znaleźć <device_name> w domu."
|
||||
not_available,fan.toggle,poddasze_1,Wentylator na poddaszu,,Przełącz <device_name>,"Przepraszam, nie mogę znaleźć tego urządzenia w domu."
|
||||
not_available,fan.increase_speed,kuchnia_2,Wentylator Kuchni,,Zwiększ prędkość <device_name>,"Przepraszam, nie mogę znaleźć tego urządzenia w domu."
|
||||
not_available,garage_door.toggle,schowek_na_rower,Drzwi do szopy na rowery,,Przełącz <device_name>,"Przepraszam, nie mogę znaleźć tego urządzenia w domu."
|
||||
already_state,lock.unlock,brama_pojazdu,Zamek bramy pojazdu,unlocked,odblokuj <device_name>,"Nie mogę tego zrobić, bo <device_name> jest już odblokowany."
|
||||
not_available,vacuum.return_to_base,piwnica_deebot,Deebot z piwnicy,,"Proszę, aby <device_name> wrócił do bazy.","Przepraszam, nie mogę zlokalizować tego urządzenia w domu."
|
||||
not_available,media_player.volume_down,salon_hi_fi_system,Salonowy dźwięk Hi-Fi,,Ścisz <device_name>,"Przepraszam, nie mogę znaleźć urządzenia <device_name> w domu."
|
||||
not_available,garage_door.toggle,wpis_zwierzaka,Drzwi wejściowe dla zwierząt,,Przełącz <device_name>,"Przepraszam, nie mogę znaleźć tego urządzenia w domu."
|
||||
not_available,blinds.close_cover,salon_pokój_duży,Rolety w dużym pokoju,,Zamknij <device_name>,"Przepraszam, nie mogę znaleźć tego urządzenia w domu."
|
||||
already_state,media_player.turn_off,samsung_hw_q90r,Soundbar Samsunga,off,Wyłącz <device_name>,"To urządzenie jest już wyłączone, więc nie muszę nic zmieniać."
|
||||
|
File diff suppressed because it is too large
Load Diff
124
data/piles/spanish/pile_of_failed_tool_calls.csv
Normal file
124
data/piles/spanish/pile_of_failed_tool_calls.csv
Normal file
@@ -0,0 +1,124 @@
|
||||
service_name,correct_device_name,correct_friendly_name,bad_device_name,phrase,error_result,retry_prompt
|
||||
light.turn_on,light.living_room_lamp,Lámpara de la sala,light.livng_room_lamp,"Por favor enciende la <device_name>.","Error: Entidad light.livng_room_lamp no encontrada.","Intentaré con la lámpara de la sala."
|
||||
climate.set_temperature,climate.hallway,Termostato del pasillo,climate.halway,"Configura el <device_name> a <temp_f> grados.","Error: Entidad climate.halway no encontrada.","Probando de nuevo con el termostato del pasillo."
|
||||
fan.turn_off,fan.office,Ventilador de la oficina,fan.offce,"Apaga el <device_name>.","Error: Entidad fan.offce no encontrada.","Volveré a intentar con el ventilador de la oficina."
|
||||
switch.turn_off,switch.luces_sala_de_estudio,Interruptor de luces de sala de estudio,switch.luces_estudio_sala,"Apaga las luces de la sala de estudio, por favor.","<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='switch.luces_estudio_sala', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Entendido, intentaré apagar el interruptor de luces de la sala de estudio."
|
||||
switch.turn_on,switch.luces_taller,Interruptor de luces de taller,switch.luces_taller_extra,"Enciende el interruptor de luces del taller, por favor.","<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='switch.luces_taller_extra', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","De acuerdo, lo intentaré con el interruptor de luces de taller."
|
||||
fan.toggle,fan.dormitorio_derecho,Ventilador del dormitorio del lado derecho,fan.dormitorio_izquierdo,¿Puedes alternar el ventilador del dormitorio del lado derecho?,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='fan.dormitorio_izquierdo', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Vale, ahora lo intento con el ventilador del dormitorio del lado derecho."
|
||||
fan.decrease_speed,fan.pasillo,ventilador de pasillo,fan.pasilloo,"Disminuye la velocidad del ventilador de pasillo, por favor.","<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='fan.pasilloo', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Entendido, lo intentaré con el ventilador de pasillo."
|
||||
switch.toggle,switch.luces_escalera,Interruptor de luces de escalera,switch.luces_escaler,¿Puedes encender la luz de la escalera?,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='switch.luces_escaler', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Entendido, lo intentaré con el dispositivo correcto."
|
||||
media_player.volume_down,media_player.altavoces_exteriores_de_patio,Altavoces exteriores para patio,media_player.altavoces_exteriores_del_patio,"Baja el volumen de los altavoces exteriores para el patio, por favor.","<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='media_player.altavoces_exteriores_del_patio', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Entendido, ahora lo intentaré con Altavoces exteriores para patio."
|
||||
fan.increase_speed,fan.habitación_niños,ventilador de la habitación de los niños,fan.habitaciónniños,"Sube la velocidad del ventilador de la habitación de los niños, por favor.","<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='fan.habitaciónniños', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Entendido, lo intentaré con el ventilador de la habitación de los niños."
|
||||
fan.increase_speed,fan.oficina,ventilador de oficina,fan.oficinas,Aumenta la velocidad del ventilador de oficina,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='fan.oficinas', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Entendido, intentaré con el ventilador de oficina."
|
||||
garage_door.toggle,garage_door.principal_1,Puerta de garaje principal,garage_door.principal_1_main,¿Puedes abrir la puerta de garaje principal?,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='garage_door.principal_1_main', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Vale, lo intento con la puerta de garaje principal."
|
||||
media_player.turn_on,media_player.chrome_cast_dormitorio,Dormitorio Chromecast,media_player.chromecast_dormit,"Por favor, enciende el Chromecast del dormitorio.","<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='media_player.chromecast_dormit', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Entendido, intentaré con el dispositivo correcto."
|
||||
media_player.volume_down,media_player.onkyo_tx_sr,Receptor de cine en casa Onkyo,media_player.onkyo_tx_sr_receptor,Baja el volumen del receptor de cine en casa Onkyo.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='media_player.onkyo_tx_sr_receptor', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Entendido, intentaré con el receptor Onkyo correcto."
|
||||
media_player.media_play_pause,media_player.xbox_den,Consola Xbox,media_player.xbox_den_consola,¿Puedes pausar la reproducción en la consola Xbox?,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='media_player.xbox_den_consola', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Entendido, intentaré con el dispositivo correcto."
|
||||
light.turn_off,light.kit_hogar_vivero_frontal,Luz delantera del cuarto de niños,light.kit_hogar_vivero_frontral,"Apaga la luz delantera del cuarto de niños, por favor.","<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='light.kit_hogar_vivero_frontral', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Entendido, lo intentaré con la luz correcta."
|
||||
vacuum.stop,vacuum.pasillo_neato,Limpiador de caminos de pasillo,vacuum.pasill_neato,"Por favor, detén el limpiador de caminos de pasillo.","<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='vacuum.pasill_neato', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","De acuerdo, lo intento con el dispositivo correcto."
|
||||
fan.turn_off,fan.baño,ventilador de baño,fan.baño_ext,"Apaga el ventilador del baño, por favor.","<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='fan.baño_ext', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","De acuerdo, lo intentaré con el ventilador de baño."
|
||||
switch.turn_on,switch.luces_cuarto_de_juegos,Interruptor de luces de sala de juegos,switch.luces_cuarto_juego,"Enciende las luces del cuarto de juegos, por favor.","<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='switch.luces_cuarto_juego', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","De acuerdo, lo intentaré con el Interruptor de luces de sala de juegos."
|
||||
switch.turn_on,switch.luces_sauna,Interruptor de luces de sauna,switch.luces_saun,"Por favor, enciende el interruptor de luces del sauna.","<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='switch.luces_saun', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Voy a intentar con el dispositivo correcto, switch.luces_sauna."
|
||||
vacuum.return_to_base,vacuum.salón_roomba,aspiradora de salón,vacuum.salón_roboma,"Por favor, lleva la aspiradora de salón a su base.","<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='vacuum.salón_roboma', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Entendido, intentaré con vacuum.salón_roomba."
|
||||
lock.unlock,lock.puerta_piscina,Puerta de piscina,lock.puerta_piscinax,"Por favor, desbloquea la puerta de la piscina","<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='lock.puerta_piscinax', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Entendido, intentaré con la cerradura correcta (lock.puerta_piscina)."
|
||||
light.turn_on,light.abajo_patio_mqtt,Luz del patio de abajo,light.patio_abajo_mqtt,"Por favor, enciende la luz del patio de abajo.","<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='light.patio_abajo_mqtt', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","De acuerdo, intentaré con la luz del patio de abajo."
|
||||
fan.decrease_speed,fan.dison_pure,Ventilador puro Dyson,fan.dyson_pure,Disminuye la velocidad del ventilador puro Dyson,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='fan.dyson_pure', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Entendido, intentaré con el dispositivo correcto (fan.dison_pure)."
|
||||
media_player.media_play_pause,media_player.nintendo_switch,interruptor de nintendo,media_player.nintedo_sw,¿Puedes pausar la reproducción en el interruptor de Nintendo?,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='media_player.nintedo_sw', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Entendido, intentaré con el dispositivo correcto."
|
||||
garage_door.toggle,garage_door.equipo_cesped,Puerta para equipo de césped,garage_door.cesped_equipo,¿Puedes abrir la puerta para el equipo de césped?,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='garage_door.cesped_equipo', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Entendido, intentaré con la puerta para equipo de césped."
|
||||
switch.turn_on,switch.luces_del_comedor,Interruptor de luces del comedor,switch.luces_del_comedor_ext,Enciende las luces del comedor,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='switch.luces_del_comedor_ext', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Entendido, intentaré con el interruptor de luces del comedor."
|
||||
fan.decrease_speed,fan.dison_pure,Ventilador puro Dyson,fan.dison_pur,Baja la velocidad del ventilador puro Dyson.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='fan.dison_pur', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","De acuerdo, lo intentaré con el Ventilador puro Dyson."
|
||||
fan.decrease_speed,fan.patio,ventilador de patio,fan.patio_ext,¿Puedes reducir la velocidad del ventilador de patio?,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='fan.patio_ext', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Entendido, ahora lo intentaré con el ventilador de patio."
|
||||
vacuum.start,vacuum.robot_esquina_izquierda,Succionador de suciedad de la esquina izquierda,vacuum.robot_esquina_izqierda,"Por favor, inicia la limpieza de la esquina izquierda.","<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='vacuum.robot_esquina_izqierda', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","De acuerdo, lo intentaré con el Succionador de suciedad de la esquina izquierda."
|
||||
light.toggle,light.cubierta_izquierda,Luz de cubierta izquierda,light.cubierta_izq_extra,"Enciende la luz de cubierta izquierda, por favor.","<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='light.cubierta_izq_extra', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","De acuerdo, lo intento con la Luz de cubierta izquierda."
|
||||
fan.increase_speed,fan.comedor,Ventilador del comedor,fan.comedorn,Aumenta la velocidad del ventilador del comedor.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='fan.comedorn', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","De acuerdo, lo intentaré con el ventilador del comedor."
|
||||
media_player.volume_up,media_player.consola_sala_de_juegos,Consola de sala de juegos,media_player.consola_sala_de_jueg,Sube el volumen de la consola de sala de juegos,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='media_player.consola_sala_de_jueg', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Entendido, intentaré con la consola de sala de juegos."
|
||||
media_player.turn_off,media_player.ipad_cocina,iPad de cocina,media_player.ipad_cocinax,"Apaga el iPad de la cocina, por favor.","<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='media_player.ipad_cocinax', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","De acuerdo, lo intentaré con el iPad de cocina."
|
||||
lock.unlock,lock.puerta_frontal_1,Cerradura de entrada principal,lock.puerta_frontal_1a,¿Puedes desbloquear la puerta de entrada principal?,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='lock.puerta_frontal_1a', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Entendido, intentaré con la cerradura de entrada principal."
|
||||
fan.decrease_speed,fan.cuarto_de_huéspedes,ventilador de la habitación de invitados,fan.cuarto_de_huéspedes_extra,Baja la velocidad del ventilador de la habitación de invitados.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='fan.cuarto_de_huéspedes_extra', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Entendido, lo intentaré con el ventilador de la habitación de invitados."
|
||||
blinds.open_cover,blinds.cochera,Persianas de garaje,blinds.cocherra,"Por favor, abre las persianas del garaje.","<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='blinds.cocherra', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","De acuerdo, ahora intentaré con las persianas de garaje."
|
||||
media_player.volume_down,media_player.nintendo_switch,interruptor de nintendo,media_player.nintendo_sw,Baja el volumen del interruptor de Nintendo,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='media_player.nintendo_sw', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Entendido, intentaré con el interruptor de Nintendo"
|
||||
light.turn_off,light.espalda_comedor_calentito,Luz cálida del comedor trasero,light.comedor_espalda_calentito,¿Puedes apagar la luz del comedor trasero?,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='light.comedor_espalda_calentito', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>",Lo intentaré de nuevo con la Luz cálida del comedor trasero.
|
||||
fan.turn_off,fan.isla_de_cocina,ventilador de cocina de refrigeración,fan.isla_cocina,"Apaga el ventilador de la cocina, por favor.","<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='fan.isla_cocina', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","De acuerdo, intentaré apagar el ventilador de cocina de refrigeración."
|
||||
light.turn_off,light.patio_1,Luz de patio exterior,light.patio_one,"Apaga la luz del patio exterior, por favor.","<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='light.patio_one', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","De acuerdo, intentaré con la Luz de patio exterior."
|
||||
vacuum.stop,vacuum.patio_puerta_vac,Limpiador de puertas de patio,vacuum.patio_puerta_vac_extra,¿Puedes detener el limpiador de puertas de patio?,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='vacuum.patio_puerta_vac_extra', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Entendido, intentaré con el dispositivo correcto."
|
||||
light.turn_off,light.front_library_ge,Luz frontal de la biblioteca,light.front_librar_ge,"Apaga la luz frontal de la biblioteca, por favor.","<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='light.front_librar_ge', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Entendido, ahora intentaré con la Luz frontal de la biblioteca."
|
||||
switch.turn_on,switch.luces_cobertizo_para_botes,Interruptor de luces del cobertizo para botes,switch.luces_cobertizo_botes_para,"Enciende las luces del cobertizo para botes, por favor.","<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='switch.luces_cobertizo_botes_para', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Entendido, intentaré con el dispositivo correcto."
|
||||
vacuum.return_to_base,vacuum.arriba_dyson,Eliminador de polvo de arriba,vacuum.arriba_dy,"¿Puedes hacer que el Eliminador de polvo de arriba vuelva a su base, por favor?","<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='vacuum.arriba_dy', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Entendido, intentaré con el dispositivo correcto."
|
||||
light.turn_off,light.abajo_zen_homekit,Luz Zen de abajo,light.zen_abajo_homekit,"Por favor, apaga la luz Zen de abajo.","<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='light.zen_abajo_homekit', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","De acuerdo, lo intentaré con la Luz Zen de abajo."
|
||||
fan.decrease_speed,fan.porche,ventilador de techo para porche,fan.porche_izquierda,"Baja la velocidad del ventilador del porche, por favor.","<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='fan.porche_izquierda', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Entendido, intentaré con el ventilador de techo para porche."
|
||||
light.turn_off,light.back_entryway_lifx,Luz de entrada trasera,light.back_entryway_lifx_extra,"Apaga la luz de la entrada trasera, por favor.","<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='light.back_entryway_lifx_extra', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","De acuerdo, lo intento con la Luz de entrada trasera."
|
||||
lock.lock,lock.perrera,Cerradura de perrera para animales,lock.perrera_ext,"Por favor, bloquea la cerradura de la perrera.","<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='lock.perrera_ext', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","De acuerdo, intentaré bloquear la cerradura de perrera."
|
||||
switch.turn_off,switch.luces_pasillo,Interruptor de luces del pasillo,switch.luces_pasill,"Apaga las luces del pasillo, por favor.","<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='switch.luces_pasill', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","De acuerdo, lo intentaré con el interruptor de luces del pasillo."
|
||||
light.toggle,light.abajo_zen_homekit,Luz Zen de abajo,light.zen_abajo_homekit,¿Puedes alternar la Luz Zen de abajo?,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='light.zen_abajo_homekit', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","De acuerdo, lo intentaré con la Luz Zen de abajo."
|
||||
switch.turn_on,switch.abridor_de_puerta_de_garage,Interruptor de apertura de puerta de garaje,switch.abridor_de_puerta_garaje_plus,"Por favor, enciende el interruptor de apertura de la puerta del garaje.","<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='switch.abridor_de_puerta_garaje_plus', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","De acuerdo, lo intentaré con el interruptor de apertura de puerta de garaje."
|
||||
light.turn_on,light.back_balcony_lifx,Luz trasera del balcón,light.back_balcony_lifx_aux,"Enciende la luz trasera del balcón, por favor.","<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='light.back_balcony_lifx_aux', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Entendido, intentaré con la luz trasera del balcón."
|
||||
lock.unlock,lock.ascensor,Cerradura de ascensor privado,lock.ascenor,"Por favor, desbloquea la cerradura del ascensor privado.","<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='lock.ascenor', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","De acuerdo, intentaré con la cerradura correcta."
|
||||
switch.turn_off,switch.luces_cobertizo_para_botes,Interruptor de luces del cobertizo para botes,switch.luces_cobertizo_botes,Apaga las luces del cobertizo para los botes,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='switch.luces_cobertizo_botes', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Entendido, intentaré apagar el interruptor de luces del cobertizo para botes."
|
||||
light.turn_on,light.estante_cocina_fresco,Estante De Cocina Luz Fría,light.estante_cocina_fresco_1,¿Puedes encender la luz del estante de la cocina fresca?,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='light.estante_cocina_fresco_1', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Entendido, intentaré con el dispositivo correcto."
|
||||
vacuum.stop,vacuum.automatizador_doméstico_inteligente,Robot de limpieza del hogar inteligente,vacuum.automatizador_doméstico_inteli,"Por favor, detén el robot de limpieza del hogar inteligente.","<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='vacuum.automatizador_doméstico_inteli', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","De acuerdo, lo intentaré con el dispositivo correcto."
|
||||
media_player.media_play_pause,media_player.altavoz_pared_pasillo,Altavoz de pared para pasillo,media_player.altavoz_pasillo_pared,Reproduce o pausa la música en el altavoz de pared para el pasillo.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='media_player.altavoz_pasillo_pared', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","De acuerdo, ahora usaré el altavoz de pared para pasillo."
|
||||
light.turn_on,light.front_observatorio_ge,Luz frontal del observatorio,light.front_observatorio_ger,Enciende la luz frontal del observatorio al 91% de brillo en blanco.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='light.front_observatorio_ger', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Entendido, intentaré con el dispositivo correcto."
|
||||
lock.unlock,lock.arma_segura,Cerradura de seguridad para armas,lock.segura_arma,¿Puedes desbloquear la cerradura de seguridad para armas?,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='lock.segura_arma', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Entendido, lo intentaré con lock.arma_segura."
|
||||
fan.increase_speed,fan.balcón,ventilador de balcón,fan.balcónx,"Sube la velocidad del ventilador de balcón, por favor.","<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='fan.balcónx', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Entendido, intentaré con el ventilador de balcón."
|
||||
vacuum.return_to_base,vacuum.pasillo_neato,Limpiador de caminos de pasillo,vacuum.pasillo_neat,"Por favor, haz que el Limpiador de caminos de pasillo regrese a su base.","<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='vacuum.pasillo_neat', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Entendido, intentaré con vacuum.pasillo_neato."
|
||||
media_player.media_play_pause,media_player.proyector_exterior_patio_trasero,Proyector de patio trasero,media_player.proyector_exterior_patio,Pausa o reproduce el proyector del patio trasero,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='media_player.proyector_exterior_patio', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Entendido, intentaré con el dispositivo correcto: media_player.proyector_exterior_patio_trasero."
|
||||
lock.lock,lock.bodega,Cerradura para bodega,lock.bodega_primaria,"Por favor, bloquea la cerradura de la bodega.","<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='lock.bodega_primaria', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","De acuerdo, lo intentaré con la cerradura para bodega."
|
||||
garage_door.stop_cover,garage_door.cochera,Puerta de garaje,garage_door.cochera,"Por favor, detén la puerta de la cochera.","<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='garage_door.cochera', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>",Lo intentaré de nuevo con la puerta de garaje correcta.
|
||||
lock.lock,lock.puerta_trasera,Cerradura de entrada al patio trasero,lock.puerta_traserra,Cierra la cerradura de la entrada al patio trasero.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='lock.puerta_traserra', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","De acuerdo, intentaré con la cerradura de la puerta trasera."
|
||||
switch.toggle,switch.luces_entrada,Control de iluminación de entrada,switch.luces_entradax,"Alterna la luz de la entrada, por favor.","<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='switch.luces_entradax', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Entendido, ahora lo intentaré con el dispositivo correcto: switch.luces_entrada."
|
||||
blinds.open_cover,blinds.ventana_trasera,Persianas de ventana trasera,blinds.ventana_trasera_extra,¿Puedes abrir la persiana de la ventana trasera?,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='blinds.ventana_trasera_extra', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","De acuerdo, lo intentaré con Persianas de ventana trasera."
|
||||
media_player.turn_off,media_player.recamara_principal,Medios del dormitorio principal,media_player.recamara_principal_extra,"Apaga los medios del dormitorio principal, por favor.","<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='media_player.recamara_principal_extra', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Entendido, intentaré apagar los Medios del dormitorio principal."
|
||||
switch.turn_on,switch.luces_traseras_de_patio,Interruptor de luces del patio trasero,switch.luces_traseras_del_patio,¿Podrías encender las luces del patio trasero?,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='switch.luces_traseras_del_patio', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","De acuerdo, lo intentaré con el interruptor de luces del patio trasero."
|
||||
blinds.close_cover,blinds.pasillo,Persianas de pasillo,blinds.pasill,"Cierra las persianas del pasillo, por favor.","<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='blinds.pasill', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","De acuerdo, lo intento con blinds.pasillo."
|
||||
garage_door.toggle,garage_door.comercio,Puerta de garaje de taller,garage_door.comerci,¿Puedes abrir la puerta de garaje del taller?,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='garage_door.comerci', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","De acuerdo, lo intentaré con la puerta de garaje de taller."
|
||||
lock.unlock,lock.sala_de_estar,Cerradura de salón,lock.sala_del_estar,¿Puedes desbloquear la cerradura del salón?,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='lock.sala_del_estar', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Entendido, intentaré con la cerradura correcta."
|
||||
climate.set_temperature,climate.bosch_bcc100,Control conectado Bosch BCC100,climate.bosch_bcc10x,"Ajusta la temperatura a <temp_f> grados, por favor.","<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='climate.bosch_bcc10x', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","De acuerdo, lo intento con el dispositivo correcto."
|
||||
vacuum.stop,vacuum.kitchen_xiaomi,aspiradora de cocina,vacuum.kitchen_xia_mi,"Por favor, detén la aspiradora de cocina.","<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='vacuum.kitchen_xia_mi', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","De acuerdo, intentaré con la aspiradora de cocina."
|
||||
switch.turn_on,switch.reflectores_de_patio,Interruptor de reflectores de jardín,switch.reflactores_de_patio,"Por favor, enciende los reflectores del jardín","<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='switch.reflactores_de_patio', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Entendido, intentaré con el interruptor correcto."
|
||||
fan.turn_on,fan.estudio_2,fanático del estudio,fan.estudio2,Enciende el ventilador del estudio.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='fan.estudio2', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Voy a intentar con el dispositivo correcto, fan.estudio_2."
|
||||
garage_door.open_cover,garage_door.dos_car,Garaje para dos automóviles,garage_door.dos_car_extra,Abre la cubierta del garaje para dos automóviles,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='garage_door.dos_car_extra', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Entendido, intentaré con el dispositivo correcto (garage_door.dos_car)."
|
||||
light.turn_on,light.front_office_mqtt,Luz de recepción,light.front_office_mqtt_main,¿Puedes encender la luz de la recepción?,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='light.front_office_mqtt_main', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Vale, ahora lo intento con la luz de la recepción."
|
||||
climate.set_temperature,climate.johnson_glas,Termostato inteligente GLAS de Johnson Controls,climate.johnson_gl,"Por favor, pon la temperatura a <temp_f> grados.","<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='climate.johnson_gl', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","De acuerdo, ahora lo intentaré con el termostato inteligente GLAS."
|
||||
media_player.volume_down,media_player.proyector_sony_4k,Proyector de cine en casa Sony,media_player.proyector_sony_4k_hd,Baja el volumen del Proyector de cine en casa Sony.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='media_player.proyector_sony_4k_hd', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","De acuerdo, lo intento con el Proyector de cine en casa Sony."
|
||||
light.toggle,light.encimera_de_la_cocina,Luces para encimera de cocina,light.encimera_cocina_de_la,Enciende la luz de la encimera de la cocina,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='light.encimera_cocina_de_la', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","De acuerdo, ahora lo intentaré con la luz de la encimera de la cocina."
|
||||
media_player.volume_down,media_player.sonos_living,Sala de estar de Sonos,media_player.sonos_living_extra,Baja el volumen del reproductor en la sala de estar.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='media_player.sonos_living_extra', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Entendido, intentaré con el dispositivo correcto (media_player.sonos_living)."
|
||||
vacuum.stop,vacuum.habitación_de_invitados_abajo,Aspiradora de la habitación de invitados de la planta baja,vacuum.habitación_invitados_abajo,Detén la aspiradora de la habitación de invitados de la planta baja.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='vacuum.habitación_invitados_abajo', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","De acuerdo, lo intentaré con la aspiradora de la habitación de invitados de la planta baja."
|
||||
light.turn_off,light.arriba_zen_zigbee,Luz Zen de arriba,light.zen_arriba_zigbee,"¿Podrías apagar la Luz Zen de arriba, por favor?","<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='light.zen_arriba_zigbee', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Entendido, intentaré con la Luz Zen de arriba."
|
||||
light.turn_on,light.arriba_observatorio_zigbee,Luz del observatorio de arriba,light.arriba_observatorio_zigbee_extra,Enciende la luz del observatorio de arriba al 73 % de brillo.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='light.arriba_observatorio_zigbee_extra', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Entendido, intentaré con la luz del observatorio de arriba."
|
||||
climate.set_temperature,climate.honeywell_lyric_t6,Honeywell Letra T6 Pro,climate.honeywell_lyric_t6_pro,Ajusta la temperatura a <temp_f> grados en la casa.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='climate.honeywell_lyric_t6_pro', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Entendido, lo intentaré con climate.honeywell_lyric_t6."
|
||||
fan.turn_on,fan.guardería,Fanático de la guardería,fan.guarderia_extra,¿Puedes encender el ventilador de la guardería?,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='fan.guarderia_extra', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>",Lo intentaré con Fanático de la guardería.
|
||||
fan.toggle,fan.estudio_1,fanático del estudio,fan.estudio_1a,¿Puedes alternar el ventilador del estudio?,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='fan.estudio_1a', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","De acuerdo, lo intento con fan.estudio_1."
|
||||
media_player.media_play_pause,media_player.audio_technica_at_lp120,Tocadiscos Audio-Technica,media_player.audio_technica_lp120_at,"Por favor, pausa la reproducción en el Tocadiscos Audio‑Technica.","<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='media_player.audio_technica_lp120_at', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Entendido, lo intentaré con el Tocadiscos Audio‑Technica."
|
||||
vacuum.return_to_base,vacuum.arriba_baño_vac,Ayudante de baño de arriba,vacuum.arriba_baño,¿Puedes hacer que el Ayudante de baño de arriba vuelva a su base?,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='vacuum.arriba_baño', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Entendido, intentaré con el dispositivo correcto."
|
||||
switch.turn_on,switch.luces_entrada,Control de iluminación de entrada,switch.luces_entradaplus,"Enciende la luz de la entrada, por favor.","<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='switch.luces_entradaplus', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Entendido, ahora intentaré con 'switch.luces_entrada'."
|
||||
lock.lock,lock.puerta_porche,Cerradura de puerta de porche,lock.puerta_prtche,"Por favor, cierra la cerradura del porche.","<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='lock.puerta_prtche', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","De acuerdo, lo intentaré con la cerradura de la puerta del porche."
|
||||
blinds.stop_cover,blinds.comedor,Persianas del comedor,blinds.comedro,"Detén la persiana del comedor, por favor.","<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='blinds.comedro', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","De acuerdo, ahora lo intentaré con Persianas del comedor."
|
||||
light.toggle,light.abajo_den_homekit,Luz del estudio de abajo,light.abajo_den_homekit_extra,Cambia el estado de la luz del estudio de abajo.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='light.abajo_den_homekit_extra', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Entendido, lo intento de nuevo con la Luz del estudio de abajo."
|
||||
fan.turn_on,fan.cocina_exterior,ventilador de cocina al aire libre,fan.cocina_exter,"Por favor, enciende el ventilador de la cocina al aire libre.","<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='fan.cocina_exter', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Entendido, ahora intentaré con el ventilador de cocina al aire libre."
|
||||
fan.turn_on,fan.techo_1,Ventiladores de techo,fan.techo_1_extra,"Enciende los ventiladores de techo, por favor.","<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='fan.techo_1_extra', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Entendido, intentaré con Ventiladores de techo."
|
||||
vacuum.start,vacuum.robot_arriba_escaleras,Dispositivo para quitar el polvo encima de las escaleras,vacuum.robot_arriba_escalera,"Por favor, inicia la limpieza del dispositivo para quitar el polvo encima de las escaleras.","<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='vacuum.robot_arriba_escalera', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Entendido, intentaré con el dispositivo correcto (vacuum.robot_arriba_escaleras)."
|
||||
media_player.turn_off,media_player.sistema_salon_hi_fi,Audio de alta fidelidad para salón,media_player.sistema_fi_hi_salon,Apaga el audio de alta fidelidad del salón.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='media_player.sistema_fi_hi_salon', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Entendido, lo intentaré con el dispositivo correcto."
|
||||
switch.turn_on,switch.iluminación_de_teatro_en_casa,Control de luces de cine en casa,switch.iluminación_de_teatro_en_cas,¿Puedes encender la iluminación del teatro en casa?,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='switch.iluminación_de_teatro_en_cas', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Entendido, ahora lo intento con el dispositivo correcto."
|
||||
vacuum.stop,vacuum.arriba_dyson,Eliminador de polvo de arriba,vacuum.arriba_dyson_extra,"Detén la aspiradora, por favor.","<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='vacuum.arriba_dyson_extra', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Entendido, intentaré con el dispositivo correcto (vacuum.arriba_dyson)."
|
||||
blinds.stop_cover,blinds.pasillo_2,Persianas del segundo pasillo,blinds.pasill_2,Detén la persiana del segundo pasillo.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='blinds.pasill_2', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Entendido, ahora lo intentaré con Persianas del segundo pasillo."
|
||||
fan.turn_off,fan.gimnasio_interior,Ventilador de gimnasio interior,fan.gimnasio_inten,"Apaga el ventilador del gimnasio interior, por favor.","<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='fan.gimnasio_inten', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","De acuerdo, intentaré con el ventilador de gimnasio interior."
|
||||
climate.turn_on,climate.johnson_glas,Termostato inteligente GLAS de Johnson Controls,climate.johnson_glass,¿Puedes encender el termostato inteligente GLAS?,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='climate.johnson_glass', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","De acuerdo, lo intentaré con el dispositivo correcto."
|
||||
switch.turn_on,switch.luces_pasarela,Interruptor de luces de pasarela,switch.luces_pasarela,"Por favor, enciende el interruptor de luces de pasarela.","<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='switch.luces_pasarela', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","De acuerdo, lo intentaré con el dispositivo correcto."
|
||||
blinds.stop_cover,blinds.sala_de_arte,Persianas para salas de manualidades.,blinds.sala_de_artes,¿Puedes detener las persianas de la sala de arte?,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='blinds.sala_de_artes', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Entendido, ahora intentaré con blinds.sala_de_arte."
|
||||
blinds.stop_cover,blinds.ventana_trasera,Persianas de ventana trasera,blinds.ventana_trase,"Por favor, detén la persiana de la ventana trasera.","<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='blinds.ventana_trase', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","De acuerdo, intentaré con la persiana de la ventana trasera."
|
||||
blinds.toggle,blinds.baño_1,primeras persianas de baño,blinds.baño_1a,¿Puedes bajar las primeras persianas del baño?,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='blinds.baño_1a', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","De acuerdo, lo intentaré con la persiana del baño."
|
||||
fan.decrease_speed,fan.porche_trasero,Ventilador del porche trasero,fan.porche_trase,Baja la velocidad del ventilador del porche trasero.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='fan.porche_trase', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Entendido, lo intentaré con el ventilador del porche trasero."
|
||||
media_player.volume_up,media_player.sótano,Reproductor multimedia del sótano,media_player.sótano_2,Sube el volumen del reproductor multimedia del sótano.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='media_player.sótano_2', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","De acuerdo, lo intento con el reproductor del sótano."
|
||||
lock.unlock,lock.sala_de_archivo,Bloqueo de la sala de archivos,lock.sala_dearchivos,"Desbloquea la sala de archivos, por favor.","<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='lock.sala_dearchivos', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Entendido, intentaré con el bloqueo de la sala de archivos."
|
||||
light.turn_off,light.estante_cocina_fresco,Rejilla De Cocina Luz Fría,light.estante_cocina_fresco_v2,"Apaga la luz de la rejilla de cocina, por favor.","<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='light.estante_cocina_fresco_v2', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","De acuerdo, lo intentaré con la luz correcta."
|
||||
fan.decrease_speed,fan.guardería,Fanático de la guardería,fan.guarderia_pro,"Baja la velocidad del ventilador de la guardería, por favor.","<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='fan.guarderia_pro', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Entendido, lo intentaré de nuevo con fan.guardería."
|
||||
media_player.volume_up,media_player.sony_bravia_tv,Televisor LED inteligente Sony,media_player.sony_bravia_tv_v2,Sube el volumen del televisor.,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='media_player.sony_bravia_tv_v2', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Entendido, intentaré con el televisor Sony correcto."
|
||||
lock.lock,lock.cocina_yale,Cocina Yale,lock.cocina_yeal,"Bloquea la cerradura de la cocina, por favor.","<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='lock.cocina_yeal', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Entendido, intentaré con lock.cocina_yale."
|
||||
fan.turn_off,fan.dormitorio_master,Ventilador del dormitorio principal,fan.master_dormitorio,¿Puedes apagar el ventilador del dormitorio principal?,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='fan.master_dormitorio', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","De acuerdo, lo intento con el ventilador del dormitorio principal."
|
||||
vacuum.return_to_base,vacuum.frente_hall_samsung,Robot de barrido del vestíbulo,vacuum.frente_hall_samsunge,"Por favor, haz que el robot de barrido del vestíbulo vuelva a su base.","<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='vacuum.frente_hall_samsunge', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Entendido, intentaré con el dispositivo correcto."
|
||||
climate.turn_off,climate.tado_inteligente,Termostato inteligente Tado,climate.tado_inteligente_v2,¿Puedes apagar el termostato inteligente?,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='climate.tado_inteligente_v2', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","De acuerdo, intento apagar el Termostato inteligente Tado."
|
||||
garage_door.open_cover,garage_door.cobertizo_2,Segunda puerta del cobertizo,garage_door.cobertizo,"¿Puedes abrir la cubierta del cobertizo, por favor?","<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='garage_door.cobertizo', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Entendido, intentaré con la segunda puerta del cobertizo."
|
||||
vacuum.stop,vacuum.comedor_area_bissel,Eliminador de suciedad del comedor,vacuum.comedor_area_bissel_extra,"Por favor, detén el limpiador del comedor.","<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='vacuum.comedor_area_bissel_extra', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","De acuerdo, lo intentaré con el dispositivo correcto."
|
||||
media_player.volume_up,media_player.punto_echo,Punto eco de cocina,media_player.punto_ec,¿Podrías subir el volumen del Punto eco de cocina?,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='media_player.punto_ec', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","Entendido, intentaré con el dispositivo correcto (media_player.punto_echo)."
|
||||
media_player.volume_down,media_player.bose_home_altavoz,Altavoz inalámbrico Bose,media_player.bose_home_altazov,"Baja el volumen del Altavoz inalámbrico Bose, por favor.","<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='media_player.bose_home_altazov', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","De acuerdo, lo intento con el Altavoz inalámbrico Bose."
|
||||
blinds.toggle,blinds.pasillo_1,Persianas del primer pasillo.,blinds.pasillo_1a,¿Puedes bajar las persianas del primer pasillo?,"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='blinds.pasillo_1a', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>","De acuerdo, lo intento con las persianas del primer pasillo."
|
||||
|
124
data/piles/spanish/pile_of_refusals.csv
Normal file
124
data/piles/spanish/pile_of_refusals.csv
Normal file
@@ -0,0 +1,124 @@
|
||||
reason_type,service_name,device_name,friendly_name,desired_state,phrase,response
|
||||
not_available,lock.lock,back_door,Cerrojo de la puerta trasera,,"Cierra con llave el <device_name>.","No encuentro un cerrojo de la puerta trasera para controlar."
|
||||
already_state,light.turn_on,hallway,Luces del pasillo,on,"Enciende las <device_name>.","Las luces del pasillo ya están encendidas."
|
||||
already_state,switch.turn_off,garage,Enchufe del garaje,off,"Apaga el <device_name>.","El enchufe del garaje ya está apagado."
|
||||
not_available,climate.set_temperature,mysa_smart_thermostat,Termostato inteligente Mysa para calentadores eléctricos de zócalo,,Ajusta la temperatura a 19 grados en <device_name>.,"Lo siento, no puedo encontrar <device_name> en tu casa."
|
||||
not_available,media_player.volume_down,sonos_arc,Barra de sonido inteligente Sonos,,Baja el volumen del <device_name>,"Lo siento, no puedo encontrar el dispositivo <device_name> en la casa."
|
||||
not_available,lock.lock,sótano,Cerradura del sótano,,Bloquear <device_name>,"Lo siento, no puedo encontrar ese dispositivo en la casa."
|
||||
not_available,media_player.volume_down,tocadiscos_vinilo_attico,Tocadiscos de vinilo para ático,,Baja el volumen del <device_name>,"Lo siento, no puedo encontrar el dispositivo <device_name> en la casa."
|
||||
not_available,switch.turn_off,luces_características_agua,Interruptor de luces de fuente de agua,,Apaga el <device_name>,"Lo siento, no puedo encontrar el <device_name> en la casa."
|
||||
not_available,light.toggle,arriba_dormitorio_niños_zigbee,Luz del dormitorio infantil de arriba,,Encender o apagar <device_name>,"Lo siento, no puedo localizar ese dispositivo en tu casa."
|
||||
not_available,fan.turn_on,centro_sala_estar,Ventilador central para salón,,Enciende el <device_name>,"Lo siento, no puedo localizar ese dispositivo en la casa."
|
||||
not_available,light.toggle,front_mancave_ge,Luz de la cueva del hombre frontal,,cambiar el estado de la luz <device_name>,"Lo siento, no puedo encontrar el dispositivo <device_name> en tu hogar."
|
||||
already_state,switch.turn_off,iluminación_de_teatro_en_casa,Control de luces de cine en casa,off,Apaga <device_name>,"Lo siento, <device_name> ya está apagado, no hay nada que cambiar."
|
||||
not_available,light.turn_off,kit_de_entrenamiento_frontal,Luz de entrenamiento frontal,,apaga la luz del <device_name>,"Lo siento, no puedo encontrar el dispositivo <device_name> en la casa."
|
||||
not_available,fan.turn_off,honeywell_turbo,Ventilador turbo Honeywell,,Apaga el <device_name>,"Lo siento, no puedo encontrar ese dispositivo en la casa."
|
||||
not_available,garage_door.stop_cover,ascensormaster_2,ascensormaster,,Detén la cubierta del <device_name>,"Lo siento, no puedo encontrar ese dispositivo en tu hogar."
|
||||
already_state,light.turn_on,yeelight_smart,Luz inteligente Yeelight,on,Enciende <device_name>,"Lo siento, <device_name> ya está encendida, no es necesario encenderla."
|
||||
not_available,light.turn_on,back_closet_warm,Armario Trasero Luz Cálida,,Enciende la luz <device_name>,"Lo siento, no encuentro el dispositivo <device_name> en la casa."
|
||||
not_available,climate.set_temperature,termostato_zen_wifi,Termostato Zen Edición WiFi,,Set the temperature of <device_name> to 27,"Lo siento, no puedo localizar ese dispositivo en la casa."
|
||||
not_available,switch.turn_on,iluminación_puerta_frontal,Interruptor de luces de puerta delantera,,Enciende <device_name>,"Lo siento, no puedo localizar <device_name> en la casa."
|
||||
not_available,blinds.toggle,baño,Persianas de baño,,alternar las persianas del <device_name>,"Lo siento, no puedo encontrar el dispositivo <device_name> en la casa."
|
||||
not_available,garage_door.toggle,sótano,Puerta de garaje del sótano,,cambia el estado de <device_name>,"Lo siento, no puedo localizar <device_name> en la casa."
|
||||
not_available,light.toggle,piso_de_arriba_mudroom_zigbee,Luz del vestíbulo de arriba,,Alternar <device_name>,"Lo siento, no puedo localizar ese dispositivo en la casa."
|
||||
not_available,fan.increase_speed,gimnasio_interior,Ventilador de gimnasio interior,,Aumenta la velocidad del <device_name>,"Lo siento, no puedo encontrar el <device_name> en tu casa."
|
||||
not_available,light.toggle,comedor_1,Luz del comedor,,Cambia el estado de la luz <device_name>,"Lo siento, no puedo encontrar el dispositivo <device_name> en tu casa."
|
||||
not_available,fan.increase_speed,baño_abajo,Ventilador en el baño de abajo,,Aumenta la velocidad del <device_name>,"Lo siento, no puedo encontrar ese dispositivo en la casa."
|
||||
already_state,media_player.turn_on,roku_dormitorio,Reproductor Roku de dormitorio,on,Enciende <device_name>,"Lo siento, <device_name> ya está encendido, no es necesario cambiar nada."
|
||||
not_available,switch.toggle,luces_características_agua,Interruptor de luces de fuente de agua,,Alternar <device_name>,"Lo siento, no encuentro <device_name> en la casa."
|
||||
not_available,climate.set_temperature,johnson_glas,Termostato inteligente GLAS de Johnson Controls,,Configura la temperatura de <device_name> a 27 grados,"Lo siento, no puedo encontrar <device_name> en tu hogar."
|
||||
already_state,lock.lock,puerta_entrada,Cerradura de puerta de entrada,locked,Bloquea el <device_name>,"Ya está bloqueado, no es necesario hacer nada."
|
||||
already_state,light.turn_on,baño_2,Luz del baño,on,Enciende la luz <device_name> en blanco,"La luz ya está encendida, no es necesario cambiar nada."
|
||||
not_available,garage_door.stop_cover,chambelán_2,Chambelán,,Detén <device_name>,"Lo siento, no puedo localizar ese dispositivo en la casa."
|
||||
not_available,media_player.volume_down,ipad_cocina,iPad de cocina,,Baja el volumen de <device_name>,"Lo siento, no encuentro un dispositivo llamado <device_name> en tu casa."
|
||||
already_state,light.turn_off,front_sideyard_ge,Luz de patio lateral delantera,off,Apaga la luz <device_name>,"Lo siento, <device_name> ya está apagada, no es necesario cambiar nada."
|
||||
not_available,vacuum.stop,habitación_de_invitados_abajo,Aspiradora de la habitación de invitados de la planta baja,,detener <device_name>,"Lo siento, no puedo localizar ese dispositivo en la casa."
|
||||
not_available,garage_door.open_cover,cobertizo_para_bicicletas,Puerta del cobertizo para bicicletas,,abrir la cubierta del <device_name>,"Lo siento, no puedo localizar ese dispositivo en tu hogar."
|
||||
not_available,switch.toggle,luces_bajo_gabinete,Interruptor de luces debajo del gabinete,,cambia <device_name>,"Lo siento, no puedo encontrar el dispositivo <device_name> en la casa."
|
||||
not_available,media_player.volume_down,huésped_habitación_tv_set,Televisión en la habitación de huéspedes,,Bajar el volumen de <device_name>,"Lo siento, no puedo encontrar <device_name> en la casa."
|
||||
not_available,climate.turn_on,trane_comfortlink_ii,Trane ComfortLink II XL1050,,encender <device_name>,"Lo siento, no puedo encontrar ese dispositivo en la casa."
|
||||
already_state,light.turn_on,abajo_mancave_homekit,Luz de la cueva del hombre de abajo,on,Encender la luz <device_name> en color amarillo,"La luz ya está encendida, no es necesario cambiar nada."
|
||||
already_state,climate.turn_on,trane_comfortlink_ii,Trane ComfortLink II XL1050,on,Enciende <device_name>,"Lo siento, <device_name> ya está encendido, no es necesario cambiar nada."
|
||||
not_available,media_player.volume_up,samsung_qled_tv,Televisor Samsung Quantum Dot,,Sube el volumen de <device_name>,"Lo siento, no puedo encontrar el dispositivo <device_name> en la casa."
|
||||
not_available,media_player.volume_down,asistente_de_voz_de_entrada,Asistente de voz de entrada,,Bajar el volumen del <device_name>,"Lo siento, no puedo encontrar el dispositivo <device_name> en la casa."
|
||||
not_available,fan.toggle,estudio_1,fanático del estudio,,cambia el estado de <device_name>,"Lo siento, no encuentro <device_name> en la casa."
|
||||
already_state,climate.turn_on,termostato_kono,Termostato inteligente Kono,on,Enciende la climatización de <device_name>,"Lo siento, <device_name> ya está encendido, no es necesario cambiar nada."
|
||||
not_available,vacuum.start,robot_esquina_izquierda,Succionador de suciedad de la esquina izquierda,,Inicia el <device_name>,"Lo siento, no puedo encontrar ese dispositivo en la casa."
|
||||
not_available,lock.unlock,cobertizo_2,Cerradura del segundo cobertizo,,Desbloquear <device_name>,"Lo siento, no puedo localizar ese dispositivo en la casa."
|
||||
already_state,garage_door.open_cover,almacenamiento_bicicletas,Garaje para guardar bicicletas,open,abrir la cubierta del <device_name>,"La cubierta ya está abierta, no es necesario hacer nada."
|
||||
not_available,fan.decrease_speed,estudio_1,fanático del estudio,,Disminuye la velocidad del <device_name>,"Lo siento, no puedo encontrar ese dispositivo en tu hogar."
|
||||
not_available,blinds.stop_cover,ikea_inteligente,Persianas Inteligentes Ikea,,Detén la persiana <device_name>,"Lo siento, no puedo encontrar la persiana <device_name> en tu hogar."
|
||||
not_available,garage_door.toggle,lado_2,Puerta de garaje lateral,,abrir o cerrar <device_name>,"Lo siento, no encuentro ese dispositivo en tu casa."
|
||||
not_available,garage_door.toggle,cochera,Puerta de garaje,,abrir <device_name>,"Lo siento, no puedo localizar <device_name> en tu casa."
|
||||
not_available,climate.turn_off,nido_aprendizaje,Termostato de aprendizaje Nest,,Apaga el clima del <device_name>,"Lo siento, no puedo encontrar ese dispositivo en la casa."
|
||||
not_available,media_player.volume_down,cocina,Reproductor multimedia de cocina,,bajar el volumen del <device_name>,"Lo siento, no puedo encontrar el dispositivo <device_name> en tu casa."
|
||||
not_available,blinds.toggle,guardería,Persianas infantiles,,cambia el estado de <device_name>,"Lo siento, no puedo localizar <device_name> en la casa."
|
||||
not_available,climate.turn_on,ecobee_smart,Termostato inteligente Ecobee,,Enciende el clima <device_name>,"Lo siento, no puedo localizar el dispositivo <device_name> en la casa."
|
||||
not_available,light.turn_on,arriba_chimenea_zwave,Luz de la chimenea de arriba,,Enciende la luz del <device_name>,"Lo siento, no puedo localizar el dispositivo <device_name> en tu hogar."
|
||||
not_available,fan.decrease_speed,porche,ventilador de techo para porche,,Disminuye la velocidad del <device_name>,"Lo siento, no puedo encontrar el <device_name> en tu casa."
|
||||
not_available,fan.turn_off,patio,ventilador de patio,,Apaga el <device_name>,"Lo siento, no puedo encontrar ese dispositivo en tu hogar."
|
||||
not_available,climate.set_temperature,bosch_bcc100,Control conectado Bosch BCC100,,Ajusta la temperatura del <device_name> a 23 grados,"Lo siento, no puedo encontrar el dispositivo <device_name> en la casa."
|
||||
already_state,switch.turn_off,luces_solárium,Interruptor de luces acristaladas,off,Apaga el <device_name>,"Lo siento, el <device_name> ya está apagado, no hay nada que cambiar."
|
||||
not_available,lock.unlock,deposito_de_seguridad,Caja de Depósitos Seguros,,Desbloquear <device_name>,"Lo siento, no puedo localizar ese dispositivo en la casa."
|
||||
not_available,media_player.turn_on,corriente_portátil,Transmisión de computadora portátil,,Enciende <device_name>,"Lo siento, no puedo localizar el dispositivo <device_name> en la casa."
|
||||
not_available,media_player.media_play_pause,tocadiscos_vinilo_attico,Tocadiscos de vinilo para ático,,Reproducir o pausar el medio en <device_name>,"Lo siento, no puedo encontrar el dispositivo <device_name> en tu hogar."
|
||||
not_available,light.turn_on,front_yard_osram,Patio delantero Osram,,encender <device_name> al 20% de brillo y color verde,"Lo siento, no puedo encontrar <device_name> en la casa."
|
||||
already_state,fan.turn_on,cocina_1,Ventiladores de cocina,on,Enciende el ventilador <device_name>,"El ventilador ya está encendido, no es necesario volver a activarlo."
|
||||
already_state,media_player.turn_on,sony_ps_lx310bt,Tocadiscos Bluetooth Sony,on,Enciende <device_name>,"Lo siento, <device_name> ya está encendido, no hay nada que cambiar."
|
||||
not_available,blinds.toggle,ventana_trasera,Persianas de ventana trasera,,alternar <device_name>,"Lo siento, no puedo encontrar <device_name> en la casa."
|
||||
already_state,media_player.turn_off,amazon_echo_show,Pantalla inteligente Amazon Echo,off,Apaga el <device_name>,"Lo siento, <device_name> ya está apagado, no hay nada que hacer."
|
||||
not_available,garage_door.stop_cover,ascensormaster_2,ascensormaster,,detener la cubierta del <device_name>,"Lo siento, no encuentro el <device_name> en tu hogar."
|
||||
already_state,media_player.media_play_pause,samsung_qled_tv,Televisor Samsung Quantum Dot,playing,Pausa <device_name>,"Ya está reproduciéndose, no es necesario pausar."
|
||||
not_available,climate.turn_on,bosch_bcc100,Control conectado Bosch BCC100,,Enciende el <device_name>,"Lo siento, no puedo localizar ese dispositivo en la casa."
|
||||
not_available,fan.turn_on,estudio_1,fanático del estudio,,Enciende el <device_name>,"Lo siento, no puedo localizar ese dispositivo en la casa."
|
||||
not_available,fan.toggle,cobertizo,ventilador de cobertizo,,Alternar el <device_name>,"Lo siento, no encuentro el <device_name> en tu hogar."
|
||||
already_state,climate.turn_off,honeywell_lyric_t6,Honeywell Letra T6 Pro,off,apaga el clima de <device_name>,"El clima ya está apagado, no es necesario hacer nada."
|
||||
already_state,vacuum.return_to_base,robot_arriba_escaleras,Dispositivo para quitar el polvo encima de las escaleras,docked,Que <device_name> vuelva a la base,"El <device_name> ya está en la base, no es necesario moverlo."
|
||||
not_available,vacuum.stop,frente_hall_samsung,Robot de barrido del vestíbulo,,Detener <device_name>,"Lo siento, no puedo localizar ese dispositivo en la casa."
|
||||
not_available,vacuum.start,master_dormitorio_tiburón,aspiradora de dormitorio principal,,Inicia <device_name>,"Lo siento, no encuentro ese dispositivo en tu casa."
|
||||
not_available,fan.turn_off,cobertizo,ventilador de cobertizo,,Apaga el <device_name>,"Lo siento, no puedo localizar ese dispositivo en la casa."
|
||||
already_state,lock.lock,estudio,Bloqueo de estudio,locked,Lock <device_name>,"Lo siento, <device_name> ya está bloqueado, no es necesario hacer nada."
|
||||
not_available,switch.toggle,luces_almacén,Interruptor de luces de almacén,,alternar <device_name>,"Lo siento, no puedo encontrar el dispositivo <device_name> en tu casa."
|
||||
already_state,lock.unlock,trastero,Cerradura del trastero,unlocked,Desbloquear <device_name>,"Lo siento, <device_name> ya está desbloqueado, no es necesario cambiar nada."
|
||||
already_state,lock.lock,oficina,Cerradura de oficina,locked,Bloquear <device_name>,"Ya está bloqueado, no es necesario cambiar nada."
|
||||
not_available,garage_door.close_cover,equipo_cesped,Puerta para equipo de césped,,cierra la cubierta del <device_name>,"Lo siento, no puedo encontrar ese dispositivo en tu casa."
|
||||
not_available,vacuum.return_to_base,arriba_baño_vac,Ayudante de baño de arriba,,Haz que <device_name> vuelva a la base,"Lo siento, no puedo encontrar ese dispositivo en la casa."
|
||||
not_available,switch.turn_on,luces_solárium,Interruptor de luces acristaladas,,Enciende <device_name>,"Lo siento, no puedo localizar <device_name> en la casa."
|
||||
not_available,fan.decrease_speed,ático_3,Ventiladores del ático,,Disminuye la velocidad del <device_name>,"Lo siento, no puedo encontrar ese dispositivo en tu casa."
|
||||
not_available,climate.set_temperature,termostato_lux_geo,Termostato Wifi Lux Geo,,Configura la temperatura del <device_name> a 25 grados,"Lo siento, no puedo localizar el <device_name> en la casa."
|
||||
already_state,garage_door.open_cover,invitado,Puerta de garaje para invitados,open,abre la cubierta del <device_name>,"Lo siento, la cubierta del <device_name> ya está abierta; no hay necesidad de hacer nada."
|
||||
already_state,media_player.turn_off,patio,Reproductor multimedia para patio,off,apaga <device_name>,"El <device_name> ya está apagado, no es necesario hacer nada."
|
||||
already_state,fan.turn_off,porche_trasero,Ventilador del porche trasero,off,Apaga el <device_name>,"Lo siento, el <device_name> ya está apagado, no hay nada que cambiar."
|
||||
not_available,media_player.volume_up,chromecast,Medios Chromecast,,Sube el volumen del <device_name>,"Lo siento, no puedo localizar el dispositivo <device_name> en la casa."
|
||||
not_available,climate.turn_on,termostato_zen_wifi,Termostato Zen Edición WiFi,,Enciende el <device_name>,"Lo siento, no puedo encontrar ese dispositivo en la casa."
|
||||
already_state,garage_door.close_cover,chambelán_2,Chambelán,closed,cierra la cubierta del <device_name>,"Lo siento, la cubierta ya está cerrada, no hay nada que cambiar."
|
||||
not_available,fan.turn_on,porche_delantero,Ventilador del porche delantero,,Enciende el <device_name>,"Lo siento, no puedo localizar el <device_name> en la casa."
|
||||
not_available,blinds.close_cover,ventana_oficina,Persianas para ventanas de oficina,,Cierra <device_name>,"Lo siento, no puedo localizar ese dispositivo en la casa."
|
||||
not_available,lock.lock,puerta_trasera,Cerradura de puerta trasera,,cierra <device_name>,"Lo siento, no puedo encontrar ese dispositivo en la casa."
|
||||
not_available,switch.turn_off,luces_taller,Interruptor de luces de taller,,apaga <device_name>,"Lo siento, no puedo localizar ese dispositivo en la casa."
|
||||
not_available,lock.unlock,puerta_trasera,Cerradura de puerta trasera,,Desbloquea <device_name>,"Lo siento, no puedo localizar <device_name> en la casa."
|
||||
not_available,lock.lock,almacenamiento_esquí,Candado para guardar esquís,,cierra la cerradura <device_name>,"Lo siento, no puedo encontrar el dispositivo <device_name> en la casa."
|
||||
not_available,vacuum.start,arriba_dyson,Eliminador de polvo de arriba,,Inicia el <device_name>,"Lo siento, no puedo localizar ese dispositivo en la casa."
|
||||
already_state,switch.turn_off,luces_cuarto_utilidad,Interruptor de luces del lavadero,off,apaga <device_name>,"El <device_name> ya está apagado, no es necesario hacer nada."
|
||||
already_state,light.turn_off,front_yard_osram,Patio delantero Osram,off,Apaga la luz de <device_name>,"Lo siento, la <device_name> ya está apagada, no hay nada que cambiar."
|
||||
not_available,switch.toggle,iluminación_de_teatro_en_casa,Control de luces de cine en casa,,cambia el estado de <device_name>,"Lo siento, no puedo localizar <device_name> en tu hogar."
|
||||
not_available,lock.unlock,puerta_piscina,Cerradura de puerta de piscina,,Desbloquear <device_name>,"Lo siento, no puedo encontrar el dispositivo <device_name> en tu casa."
|
||||
not_available,vacuum.stop,patio_puerta_vac,Limpiador de puertas de patio,,Detén el <device_name>,"Lo siento, no puedo localizar ese dispositivo en la casa."
|
||||
not_available,climate.set_temperature,sinope_inteligente,Termostato inteligente Sinopé,,Ajusta la temperatura del <device_name> a 27 grados,"Lo siento, no puedo localizar el <device_name> en tu hogar."
|
||||
not_available,fan.decrease_speed,porche,ventilador de techo para porche,,Baja la velocidad del <device_name>,"Lo siento, no puedo encontrar el <device_name> en la casa."
|
||||
not_available,climate.set_temperature,nido_aprendizaje,Termostato de aprendizaje Nest,,Ajusta la temperatura del <device_name> a 24 grados,"Lo siento, no puedo localizar el <device_name> en la casa."
|
||||
already_state,climate.turn_on,johnson_glas,Termostato inteligente GLAS de Johnson Controls,on,encender el clima en <device_name>,"Lo siento, <device_name> ya está encendido, no hay nada que cambiar."
|
||||
not_available,media_player.media_play_pause,bose_living,Sala de estar Bosé,,reproducir o pausar <device_name>,"Lo siento, no puedo localizar el dispositivo <device_name> en la casa."
|
||||
not_available,media_player.turn_on,punto_echo,Punto eco de cocina,,Enciende <device_name>,"Lo siento, no puedo localizar el dispositivo <device_name> en tu hogar."
|
||||
already_state,climate.turn_off,emerson_sensi_touch,Termostato WiFi Emerson Sensi Touch,off,Apaga el clima de <device_name>,"El dispositivo ya está apagado, no es necesario realizar ningún cambio."
|
||||
not_available,lock.lock,puerta_lateral,Cerradura de puerta lateral,,Lock the <device_name>,"Lo siento, no puedo encontrar el dispositivo <device_name> en tu hogar."
|
||||
not_available,lock.lock,despensa,Cerradura de despensa,,Bloquear <device_name>,"Lo siento, no puedo encontrar el dispositivo <device_name> en tu hogar."
|
||||
not_available,media_player.volume_down,huésped_habitación_tv_set,Televisión en la habitación de huéspedes,,Baja el volumen de <device_name>,"Lo siento, no puedo encontrar el dispositivo <device_name> en la casa."
|
||||
not_available,fan.increase_speed,dormitorio,Ventilador de dormitorio,,Aumenta la velocidad del <device_name>,"Lo siento, no puedo localizar el <device_name> en la casa."
|
||||
not_available,fan.toggle,cocina_1,Ventiladores de cocina,,Alternar <device_name>,"Lo siento, no puedo localizar <device_name> en tu hogar."
|
||||
not_available,vacuum.return_to_base,entrada_eufy,Colector de polvo de entrada,,Haz que <device_name> vuelva a la base,"Lo siento, no puedo localizar ese dispositivo en la casa."
|
||||
already_state,light.turn_off,espejo_de_baño,Luces de espejo,off,apaga la luz <device_name>,"La luz ya está apagada, no hay nada que cambiar."
|
||||
already_state,blinds.close_cover,claraboya,Persianas de tragaluz,closed,Cierra la persiana <device_name>,"Lo siento, <device_name> ya está cerrada, no hay nada que cambiar."
|
||||
not_available,light.turn_on,front_playroom_homekit,Luz frontal de la sala de juegos,,encender <device_name>,"Lo siento, no puedo localizar ese dispositivo en la casa."
|
||||
not_available,fan.turn_off,estudio_2,fanático del estudio,,Apaga el <device_name>,"Lo siento, no puedo encontrar el <device_name> en la casa."
|
||||
already_state,media_player.turn_on,consola_sala_de_juegos,Consola de sala de juegos,on,Enciende <device_name>,"Ya está encendido, no es necesario cambiar nada."
|
||||
|
File diff suppressed because it is too large
Load Diff
65
data/prompting.py
Normal file
65
data/prompting.py
Normal file
@@ -0,0 +1,65 @@
|
||||
import babel.dates
|
||||
|
||||
from utils import Example, generate_random_datetime
|
||||
|
||||
CURRENT_DATE_PROMPT = {
|
||||
"english": "The current time and date is",
|
||||
"polish": "Aktualna godzina i data to",
|
||||
"german": "Die aktuelle Uhrzeit und das aktuelle Datum sind",
|
||||
"french": "L'heure et la date actuelles sont",
|
||||
"spanish": "La hora y fecha actuales son"
|
||||
}
|
||||
|
||||
DEVICES_PROMPT = {
|
||||
"english": "Devices",
|
||||
"polish": "Urządzenia",
|
||||
"german": "Ger\u00e4te",
|
||||
"french": "Appareils",
|
||||
"spanish": "Dispositivos"
|
||||
}
|
||||
|
||||
SERVICES_PROMPT = {
|
||||
"english": "Services",
|
||||
"polish": "Usługi",
|
||||
"german": "Dienste",
|
||||
"french": "Services",
|
||||
"spanish": "Servicios"
|
||||
}
|
||||
|
||||
BABEL_LOCALE = {
|
||||
"english": "en_US",
|
||||
"polish": "pl_PL",
|
||||
"german": "de_DE",
|
||||
"french": "fr_FR",
|
||||
"spanish": "es_ES"
|
||||
}
|
||||
|
||||
BABEL_FORMAT = {
|
||||
"english": "h:m a 'on' EEEE, MMMM d yyyy",
|
||||
"polish": "H:m 'w' EEEE, d MMMM yyyy",
|
||||
"german": "H:m EEEE, d MMMM yyyy",
|
||||
"french": "H:m EEEE, d MMMM yyyy",
|
||||
"spanish": "H:m EEEE, d 'de' MMMM 'de' yyyy"
|
||||
}
|
||||
|
||||
USER_INSTRUCTION_PROMPT = {
|
||||
"english": "User instruction",
|
||||
"german": "Benutzeranweisung",
|
||||
"french": "Instruction de l'utilisateur ",
|
||||
"spanish": "Instrucción del usuario",
|
||||
"polish": "Instrukcja użytkownika"
|
||||
}
|
||||
|
||||
|
||||
def generate_system_prompt(example: Example, persona: str, language: str, pile_of_system_prompts: dict[str, str]) -> str:
|
||||
sys_prompt = pile_of_system_prompts[persona]
|
||||
random_datetime = generate_random_datetime()
|
||||
translate_datetime = babel.dates.format_datetime(random_datetime, BABEL_FORMAT[language], locale=BABEL_LOCALE[language])
|
||||
time_block = f"{CURRENT_DATE_PROMPT[language]} {translate_datetime}"
|
||||
|
||||
states_block = f"{DEVICES_PROMPT[language]}:\n" + "\n".join(example["states"])
|
||||
|
||||
# replace aliases with their actual values
|
||||
states_block = states_block.replace("blinds.", "cover.").replace("garage_door.", "cover.")
|
||||
|
||||
return "\n".join([sys_prompt, time_block, states_block])
|
||||
398
data/reformat_responses.py
Normal file
398
data/reformat_responses.py
Normal file
@@ -0,0 +1,398 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
Script to reformat CSV responses by splitting the 'response' column into
|
||||
'response_starting' (action in progress) and 'response_confirmed' (action completed)
|
||||
using llama.cpp's native chat completion endpoint with concurrent aiohttp calls.
|
||||
|
||||
pip3 install aiohttp pydantic tqdm
|
||||
"""
|
||||
import argparse
|
||||
import asyncio
|
||||
import csv
|
||||
import json
|
||||
import os
|
||||
import random
|
||||
from pathlib import Path
|
||||
from typing import Dict, List, Optional, Tuple
|
||||
|
||||
import aiohttp
|
||||
from pydantic import BaseModel, Field
|
||||
from tqdm import tqdm
|
||||
|
||||
|
||||
class ResponseFormat(BaseModel):
|
||||
response_starting: str = Field(description="Response indicating the action is in progress")
|
||||
response_confirmed: str = Field(description="Response indicating the action has been completed")
|
||||
|
||||
|
||||
TASK_DESCRIPTION = """
|
||||
You are reformatting assistant responses for a smart home system.
|
||||
|
||||
Given an original response that describes an action, generate TWO variations:
|
||||
1. response_starting: A response indicating the action is IN PROGRESS (starting, initiating, working on it)
|
||||
2. response_confirmed: A response indicating the action has been SUCCESSFULLY COMPLETED (done, completed, finished)
|
||||
|
||||
Both responses should:
|
||||
- Maintain the same tone and persona as the original
|
||||
- Keep any device names or parameters (like <device_name>, <temp_f>, etc.) exactly as they appear
|
||||
- Be natural and conversational
|
||||
- Be concise (similar length to the original)
|
||||
- Avoid overly formal language
|
||||
- Preserve the language of the original data even if it is not English
|
||||
|
||||
Example:
|
||||
Original: "Opening the blinds for you."
|
||||
{
|
||||
"response_starting": "Opening the blinds now."
|
||||
"response_confirmed": "The blinds are now open."
|
||||
}
|
||||
|
||||
Original: "Setting temperature to <temp_f> degrees."
|
||||
{
|
||||
"response_starting": "Setting temperature to <temp_f> degrees."
|
||||
"response_confirmed": "Temperature has been set to <temp_f> degrees."
|
||||
}
|
||||
|
||||
Respond ONLY with a JSON object in this exact format:
|
||||
{
|
||||
"response_starting": "your starting response here",
|
||||
"response_confirmed": "your confirmed response here"
|
||||
}
|
||||
"""
|
||||
|
||||
JSON_SCHEMA = ResponseFormat.model_json_schema()
|
||||
|
||||
|
||||
def load_system_prompts(system_prompts_path: Path) -> Dict[str, str]:
|
||||
"""Load system prompts from CSV file."""
|
||||
prompts: Dict[str, str] = {}
|
||||
with open(system_prompts_path, 'r', encoding='utf-8') as f:
|
||||
reader = csv.DictReader(f)
|
||||
for row in reader:
|
||||
prompts[row['persona']] = row['prompt']
|
||||
return prompts
|
||||
|
||||
|
||||
def _extract_message_content(payload: Dict) -> str:
|
||||
"""Extract assistant message content from diverse llama.cpp response shapes."""
|
||||
if not isinstance(payload, dict):
|
||||
return ''
|
||||
|
||||
if 'choices' in payload and payload['choices']:
|
||||
message = payload['choices'][0].get('message', {})
|
||||
content = message.get('content')
|
||||
else:
|
||||
content = payload.get('content')
|
||||
|
||||
if isinstance(content, list):
|
||||
parts: List[str] = []
|
||||
for item in content:
|
||||
if isinstance(item, dict):
|
||||
parts.append(item.get('text', ''))
|
||||
elif isinstance(item, str):
|
||||
parts.append(item)
|
||||
return ''.join(parts)
|
||||
if isinstance(content, str):
|
||||
return content
|
||||
return ''
|
||||
|
||||
|
||||
async def generate_reformatted_responses(
|
||||
session: aiohttp.ClientSession,
|
||||
url: str,
|
||||
model: str,
|
||||
system_prompt: str,
|
||||
original_response: str,
|
||||
service: str,
|
||||
semaphore: asyncio.Semaphore,
|
||||
max_attempts: int,
|
||||
) -> Dict[str, str]:
|
||||
"""Use llama.cpp chat endpoint to generate structured responses with retries."""
|
||||
|
||||
user_message = f"""Service: {service}
|
||||
Original response: {original_response}
|
||||
|
||||
Generate the two response variations as specified."""
|
||||
|
||||
conversation = [
|
||||
{
|
||||
"role": "system",
|
||||
"content": "You are a helpful synthetic data generation assistant. Your task is to respond only using JSON format as specified."
|
||||
},
|
||||
{
|
||||
"role": "user",
|
||||
"content": f"{TASK_DESCRIPTION}\n\nCurrent Persona System Prompt: {system_prompt}\n{user_message}"
|
||||
},
|
||||
]
|
||||
|
||||
schema_payload = {
|
||||
"type": "json_schema",
|
||||
"json_schema": {
|
||||
"name": "response_format",
|
||||
"schema": JSON_SCHEMA,
|
||||
},
|
||||
}
|
||||
|
||||
attempts_remaining = max_attempts
|
||||
last_error: Optional[Exception] = None
|
||||
|
||||
content = None
|
||||
|
||||
while attempts_remaining > 0:
|
||||
attempts_remaining -= 1
|
||||
payload = {
|
||||
"model": model,
|
||||
"messages": conversation,
|
||||
"seed": random.randint(1, 1_000_000),
|
||||
"response_format": schema_payload,
|
||||
"stream": False,
|
||||
}
|
||||
|
||||
try:
|
||||
async with semaphore:
|
||||
async with session.post(url, json=payload) as response:
|
||||
response.raise_for_status()
|
||||
data = await response.json()
|
||||
|
||||
content = _extract_message_content(data)
|
||||
result = json.loads(content)
|
||||
|
||||
if 'response_starting' not in result or 'response_confirmed' not in result:
|
||||
raise ValueError(f"Invalid response format: {result}")
|
||||
|
||||
return {
|
||||
'response_starting': result['response_starting'],
|
||||
'response_confirmed': result['response_confirmed'],
|
||||
}
|
||||
except Exception as exc: # noqa: BLE001
|
||||
last_error = exc
|
||||
print(f"\nError processing response '{original_response}': {exc} - new response '{content}'")
|
||||
conversation.append({
|
||||
"role": "user",
|
||||
"content": "The previous response was invalid. Respond ONLY with JSON matching the schema: " + str(JSON_SCHEMA),
|
||||
})
|
||||
|
||||
print(
|
||||
f"Failed to reformat response after multiple attempts. Using original response of '{original_response}'."
|
||||
)
|
||||
if last_error:
|
||||
print(f"Last error: {last_error}")
|
||||
return {
|
||||
'response_starting': original_response,
|
||||
'response_confirmed': original_response,
|
||||
}
|
||||
|
||||
|
||||
async def process_csv(
|
||||
input_path: Path,
|
||||
output_path: Path,
|
||||
system_prompts_path: Path,
|
||||
base_endpoint: str,
|
||||
route: str,
|
||||
api_key: str | None,
|
||||
model: str,
|
||||
max_concurrency: int,
|
||||
max_attempts: int,
|
||||
request_timeout: float,
|
||||
):
|
||||
"""Process the CSV file and generate reformatted responses concurrently."""
|
||||
|
||||
print("Loading system prompts...")
|
||||
system_prompts = load_system_prompts(system_prompts_path)
|
||||
print(f"Loaded {len(system_prompts)} personas: {', '.join(system_prompts.keys())}")
|
||||
|
||||
print(f"\nReading input file: {input_path}")
|
||||
with open(input_path, 'r', encoding='utf-8') as input_file:
|
||||
reader = csv.DictReader(input_file)
|
||||
rows = list(reader)
|
||||
total_rows = len(rows)
|
||||
print(f"Processing {total_rows} rows with concurrency={max_concurrency}...")
|
||||
|
||||
headers = {}
|
||||
if api_key:
|
||||
headers["Authorization"] = f"Bearer {api_key}"
|
||||
|
||||
timeout = aiohttp.ClientTimeout(total=request_timeout)
|
||||
endpoint = base_endpoint.rstrip('/') + '/' + route.lstrip('/')
|
||||
|
||||
semaphore = asyncio.Semaphore(max_concurrency)
|
||||
|
||||
output_file = open(output_path, 'w', encoding='utf-8', newline='')
|
||||
fieldnames = ['service', 'response_starting', 'response_confirmed', 'persona', 'short']
|
||||
writer = csv.DictWriter(output_file, fieldnames=fieldnames)
|
||||
writer.writeheader()
|
||||
|
||||
async with aiohttp.ClientSession(headers=headers, timeout=timeout) as session:
|
||||
tasks = []
|
||||
for idx, row in enumerate(rows):
|
||||
tasks.append(
|
||||
asyncio.create_task(
|
||||
process_row(
|
||||
idx,
|
||||
row,
|
||||
session,
|
||||
endpoint,
|
||||
model,
|
||||
system_prompts,
|
||||
semaphore,
|
||||
max_attempts,
|
||||
)
|
||||
)
|
||||
)
|
||||
|
||||
progress = tqdm(total=total_rows, desc="Generating responses")
|
||||
try:
|
||||
for coro in asyncio.as_completed(tasks):
|
||||
idx, output_row = await coro
|
||||
writer.writerow(output_row)
|
||||
output_file.flush()
|
||||
progress.update(1)
|
||||
finally:
|
||||
progress.close()
|
||||
|
||||
output_file.close()
|
||||
|
||||
print(f"✓ Successfully processed {total_rows} rows")
|
||||
print(f"✓ Output saved to: {output_path}")
|
||||
|
||||
|
||||
async def process_row(
|
||||
idx: int,
|
||||
row: Dict[str, str],
|
||||
session: aiohttp.ClientSession,
|
||||
endpoint: str,
|
||||
model: str,
|
||||
system_prompts: Dict[str, str],
|
||||
semaphore: asyncio.Semaphore,
|
||||
max_attempts: int,
|
||||
) -> Tuple[int, Dict[str, str]]:
|
||||
"""Process a single CSV row asynchronously."""
|
||||
|
||||
service = row['service']
|
||||
original_response = row['response']
|
||||
persona = row['persona']
|
||||
short = row['short']
|
||||
|
||||
system_prompt = system_prompts.get(persona, system_prompts.get('assistant', ''))
|
||||
|
||||
reformatted = await generate_reformatted_responses(
|
||||
session=session,
|
||||
url=endpoint,
|
||||
model=model,
|
||||
system_prompt=system_prompt,
|
||||
original_response=original_response,
|
||||
service=service,
|
||||
semaphore=semaphore,
|
||||
max_attempts=max_attempts,
|
||||
)
|
||||
|
||||
output_row = {
|
||||
'service': service,
|
||||
'response_starting': reformatted['response_starting'],
|
||||
'response_confirmed': reformatted['response_confirmed'],
|
||||
'persona': persona,
|
||||
'short': short,
|
||||
}
|
||||
|
||||
return idx, output_row
|
||||
|
||||
|
||||
def main() -> int:
|
||||
parser = argparse.ArgumentParser(
|
||||
description="Reformat CSV responses using llama.cpp chat completions with concurrent aiohttp calls",
|
||||
)
|
||||
parser.add_argument('input_csv', type=Path, help='Input CSV file path (e.g., pile_of_responses.csv)')
|
||||
parser.add_argument('output_csv', type=Path, help='Output CSV file path')
|
||||
parser.add_argument(
|
||||
'--system-prompts',
|
||||
type=Path,
|
||||
help='Path to system prompts CSV file (default: same directory as input, pile_of_system_prompts.csv)',
|
||||
)
|
||||
parser.add_argument(
|
||||
'--endpoint',
|
||||
type=str,
|
||||
default='https://ai.cloud.alexoconnell.net/v1',
|
||||
help='Base URL for the llama.cpp server (default: https://ai.cloud.alexoconnell.net)',
|
||||
)
|
||||
parser.add_argument(
|
||||
'--route',
|
||||
type=str,
|
||||
default='/chat/completions',
|
||||
help='Route for the llama.cpp chat completion endpoint (default: /chat/completions)',
|
||||
)
|
||||
parser.add_argument(
|
||||
'--api-key',
|
||||
type=str,
|
||||
default=None,
|
||||
help='Optional API key for the llama.cpp server (default: use OPENAI_API_KEY env var if set)',
|
||||
)
|
||||
parser.add_argument(
|
||||
'--model',
|
||||
type=str,
|
||||
default='gpt-oss-120b',
|
||||
help='Model to use (default: gpt-oss-120b)',
|
||||
)
|
||||
parser.add_argument(
|
||||
'--max-concurrency',
|
||||
type=int,
|
||||
default=4,
|
||||
help='Maximum number of concurrent generations (default: 4)',
|
||||
)
|
||||
parser.add_argument(
|
||||
'--max-attempts',
|
||||
type=int,
|
||||
default=3,
|
||||
help='Maximum number of retries per row (default: 3)',
|
||||
)
|
||||
parser.add_argument(
|
||||
'--timeout',
|
||||
type=float,
|
||||
default=60.0,
|
||||
help='Total request timeout in seconds (default: 60.0)',
|
||||
)
|
||||
|
||||
args = parser.parse_args()
|
||||
|
||||
if not args.input_csv.exists():
|
||||
print(f"Error: Input file not found: {args.input_csv}")
|
||||
return 1
|
||||
|
||||
if args.system_prompts:
|
||||
system_prompts_path = args.system_prompts
|
||||
else:
|
||||
system_prompts_path = args.input_csv.parent / 'pile_of_system_prompts.csv'
|
||||
|
||||
if not system_prompts_path.exists():
|
||||
print(f"Error: System prompts file not found: {system_prompts_path}")
|
||||
return 1
|
||||
|
||||
api_key = args.api_key or os.environ.get('OPENAI_API_KEY')
|
||||
|
||||
args.output_csv.parent.mkdir(parents=True, exist_ok=True)
|
||||
|
||||
try:
|
||||
asyncio.run(
|
||||
process_csv(
|
||||
input_path=args.input_csv,
|
||||
output_path=args.output_csv,
|
||||
system_prompts_path=system_prompts_path,
|
||||
base_endpoint=args.endpoint,
|
||||
route=args.route,
|
||||
api_key=api_key,
|
||||
model=args.model,
|
||||
max_concurrency=args.max_concurrency,
|
||||
max_attempts=args.max_attempts,
|
||||
request_timeout=args.timeout,
|
||||
)
|
||||
)
|
||||
return 0
|
||||
except Exception as exc: # noqa: BLE001
|
||||
print(f"Error: {exc}")
|
||||
import traceback
|
||||
|
||||
traceback.print_exc()
|
||||
return 1
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
raise SystemExit(main())
|
||||
@@ -3,4 +3,7 @@ webcolors>=24.8.0
|
||||
pandas>=2.2.3
|
||||
deep-translator>=1.11.4
|
||||
langcodes>=3.5.0
|
||||
babel==2.15.0
|
||||
babel>=2.15.0
|
||||
aiohttp>=3.9.0
|
||||
pydantic>=2.5.0
|
||||
tqdm>=4.66.0
|
||||
896
data/synthesize.py
Normal file
896
data/synthesize.py
Normal file
@@ -0,0 +1,896 @@
|
||||
import argparse
|
||||
import asyncio
|
||||
import csv
|
||||
import json
|
||||
import random
|
||||
import string
|
||||
import aiohttp
|
||||
from tqdm import tqdm
|
||||
import os
|
||||
|
||||
from utils import get_dataset_piles
|
||||
from devices import random_device_list
|
||||
|
||||
LLM_ENDPOINT = "https://ai.cloud.alexoconnell.net/v1/chat/completions"
|
||||
cwd = os.path.dirname(os.path.abspath(__file__))
|
||||
|
||||
def get_hass_match_error_message(bad_device_name: str) -> str:
|
||||
return f"<MatchFailedError result=MatchTargetsResult(is_match=False, no_match_reason=<MatchFailedReason.NAME: 1>, states=[], no_match_name=None, areas=[], floors=[]), constraints=MatchTargetsConstraints(name='{bad_device_name}', area_name=None, floor_name=None, domains=None, device_classes=None, features=None, states=None, assistant='conversation', allow_duplicate_names=False, single_target=False), preferences=MatchTargetsPreferences(area_id=None, floor_id=None)>"
|
||||
|
||||
class SyntheticDataGenerator:
|
||||
def __init__(self, model_name: str, language: str, concurrency: int):
|
||||
self.language = language
|
||||
self.concurrency = concurrency
|
||||
self.model_name = model_name
|
||||
self.piles = get_dataset_piles(language)
|
||||
self.synthetic_devices = {} # device_type -> list of {device_name, description}
|
||||
self.failed_tool_fieldnames = [
|
||||
"service_name",
|
||||
"correct_device_name",
|
||||
"correct_friendly_name",
|
||||
"bad_device_name",
|
||||
"phrase",
|
||||
"error_result",
|
||||
"retry_prompt"
|
||||
]
|
||||
self.refusal_fieldnames = [
|
||||
"reason_type",
|
||||
"service_name",
|
||||
"device_name",
|
||||
"friendly_name",
|
||||
"desired_state",
|
||||
"phrase",
|
||||
"response"
|
||||
]
|
||||
|
||||
async def _chat_completion(self, session, system_prompt: str, user_prompt: str, *, temperature: float = 0.8, max_tokens: int = 300, structured_response: dict = {}):
|
||||
payload = {
|
||||
"model": self.model_name,
|
||||
"messages": [
|
||||
{"role": "system", "content": system_prompt},
|
||||
{"role": "user", "content": user_prompt}
|
||||
],
|
||||
"temperature": temperature,
|
||||
"max_tokens": max_tokens if not structured_response else None, # don't limit if structured (causes failed generations)
|
||||
"response_format": structured_response if structured_response else None,
|
||||
}
|
||||
|
||||
try:
|
||||
async with session.post(LLM_ENDPOINT, json=payload) as response:
|
||||
if response.status < 400:
|
||||
data = await response.json()
|
||||
return data['choices'][0]['message']['content'].strip()
|
||||
print(f"LLM request failed with status {response.status}")
|
||||
except Exception as exc:
|
||||
print(f"Completion request failed: {exc}")
|
||||
return None
|
||||
|
||||
@staticmethod
|
||||
def _strip_code_fence(content: str) -> str:
|
||||
if not content:
|
||||
return ""
|
||||
text = content.strip()
|
||||
if text.startswith("```") and text.endswith("```"):
|
||||
lines = [line for line in text.splitlines() if not line.strip().startswith("```")]
|
||||
return "\n".join(lines).strip()
|
||||
return text
|
||||
|
||||
def _parse_json_object(self, content: str):
|
||||
if not content:
|
||||
return None
|
||||
cleaned = self._strip_code_fence(content)
|
||||
start = cleaned.find("{")
|
||||
end = cleaned.rfind("}")
|
||||
if start == -1 or end == -1:
|
||||
return None
|
||||
snippet = cleaned[start:end+1]
|
||||
try:
|
||||
return json.loads(snippet)
|
||||
except json.JSONDecodeError:
|
||||
return None
|
||||
|
||||
@staticmethod
|
||||
def _ensure_placeholder(text: str, friendly_name: str, placeholder: str) -> str:
|
||||
if placeholder in text:
|
||||
return text
|
||||
lower_text = text.lower()
|
||||
lower_name = friendly_name.lower()
|
||||
idx = lower_text.find(lower_name)
|
||||
if idx == -1:
|
||||
return text
|
||||
return text[:idx] + placeholder + text[idx + len(friendly_name):]
|
||||
|
||||
@staticmethod
|
||||
def _describe_service(service_name: str, service_data: dict) -> str:
|
||||
domain, action = service_name.split(".", 1)
|
||||
description = f"{action.replace('_', ' ')} the {domain}"
|
||||
if service_data:
|
||||
description += f" with arguments {json.dumps(service_data, ensure_ascii=False)}"
|
||||
return description
|
||||
|
||||
@staticmethod
|
||||
def _desired_state_for_service(service_name: str) -> str:
|
||||
action = service_name.split(".", 1)[1]
|
||||
action_mapping = {
|
||||
"turn_on": "on",
|
||||
"turn_off": "off",
|
||||
"open_cover": "open",
|
||||
"close_cover": "closed",
|
||||
"lock": "locked",
|
||||
"unlock": "unlocked",
|
||||
"media_play_pause": "playing",
|
||||
}
|
||||
if action in action_mapping:
|
||||
return action_mapping[action]
|
||||
service_mapping = {
|
||||
"media_player.turn_on": "on",
|
||||
"media_player.turn_off": "off",
|
||||
"vacuum.start": "cleaning",
|
||||
"vacuum.return_to_base": "docked",
|
||||
"garage_door.open_cover": "open",
|
||||
"garage_door.close_cover": "closed",
|
||||
"blinds.open_cover": "open",
|
||||
"blinds.close_cover": "closed",
|
||||
}
|
||||
return service_mapping.get(service_name, "")
|
||||
|
||||
@staticmethod
|
||||
def _append_rows_to_csv(path: str, fieldnames, rows):
|
||||
if not rows:
|
||||
return
|
||||
os.makedirs(os.path.dirname(path), exist_ok=True)
|
||||
file_exists = os.path.exists(path)
|
||||
if not file_exists:
|
||||
with open(path, "w", newline='', encoding='utf-8') as f:
|
||||
writer = csv.DictWriter(f, fieldnames=fieldnames)
|
||||
writer.writeheader()
|
||||
with open(path, "a", newline='', encoding='utf-8') as f:
|
||||
writer = csv.DictWriter(f, fieldnames=fieldnames)
|
||||
for row in rows:
|
||||
writer.writerow(row)
|
||||
|
||||
async def generate_device_names(self, session, device_type, count=10):
|
||||
"""
|
||||
Generates a list of new device names for a given type.
|
||||
"""
|
||||
system_prompt = "You are a creative assistant that generates realistic smart home device names."
|
||||
user_prompt = f"Generate {count} realistic and diverse friendly names for a smart home device of type '{device_type}' (e.g. 'Kitchen Light', 'Porch Fan', 'Master Bedroom Blinds').\n" \
|
||||
f"Output ONLY the names, one per line. Do not number them. Do not include the device type if it's not part of the natural name."
|
||||
|
||||
payload = {
|
||||
"model": self.model_name,
|
||||
"messages": [
|
||||
{"role": "system", "content": system_prompt},
|
||||
{"role": "user", "content": user_prompt}
|
||||
],
|
||||
"temperature": 1.2,
|
||||
"max_tokens": 200,
|
||||
}
|
||||
|
||||
try:
|
||||
async with session.post(LLM_ENDPOINT, json=payload) as response:
|
||||
if response.status == 200:
|
||||
data = await response.json()
|
||||
content = data['choices'][0]['message']['content'].strip()
|
||||
names = [line.strip() for line in content.split('\n') if line.strip()]
|
||||
|
||||
# Add to synthetic devices
|
||||
if device_type not in self.synthetic_devices:
|
||||
self.synthetic_devices[device_type] = []
|
||||
|
||||
new_devices = []
|
||||
for name in names:
|
||||
# Create a fake entity ID
|
||||
slug = name.lower().replace(" ", "_").replace("'", "")
|
||||
entity_id = f"{device_type}.{slug}"
|
||||
device_entry = {
|
||||
"device_name": entity_id,
|
||||
"description": name
|
||||
}
|
||||
self.synthetic_devices[device_type].append(device_entry)
|
||||
new_devices.append(device_entry)
|
||||
|
||||
print(f"Generated {len(names)} new names for {device_type}")
|
||||
return new_devices
|
||||
else:
|
||||
print(f"Failed to generate device names: {response.status}")
|
||||
return []
|
||||
except Exception as e:
|
||||
print(f"Device generation failed: {e}")
|
||||
return []
|
||||
|
||||
async def generate_phrase(self, session, context):
|
||||
"""
|
||||
Generates a user phrase for a given context (device, service, args).
|
||||
"""
|
||||
task_type = context.get("type", "action")
|
||||
device_name = context["device_name"]
|
||||
friendly_name = context["friendly_name"]
|
||||
|
||||
system_prompt = "You are a helpful assistant that generates synthetic training data for a smart home voice assistant. " \
|
||||
"Your goal is to generate diverse, natural, and realistic user commands based on a specific action. " \
|
||||
"The commands should vary in complexity and phrasing."
|
||||
|
||||
if task_type == "action":
|
||||
service_name = context["service_name"]
|
||||
service_args = context["service_data"]
|
||||
|
||||
user_prompt = f"""
|
||||
Task: Generate a natural language voice command in {self.language} that a user would say to perform the following action.
|
||||
|
||||
Target Device: {friendly_name} (ID: {device_name})
|
||||
Action: {service_name}
|
||||
Arguments: {json.dumps(service_args)}
|
||||
|
||||
Instructions:
|
||||
1. The command must be in {self.language}.
|
||||
2. The command should be natural and conversational.
|
||||
3. Do not include the device ID (e.g., {device_name}) in the command, only refer to it by name or context.
|
||||
4. Include the necessary information to imply the arguments (e.g., if brightness is 50%, mention "50%" or "half brightness").
|
||||
5. Provide ONLY the command text. Do not add quotes or explanations.
|
||||
"""
|
||||
elif task_type == "status":
|
||||
attribute = context["attribute"]
|
||||
user_prompt = f"""
|
||||
Task: Generate a natural language question in {self.language} that a user would ask to check the status of a device.
|
||||
|
||||
Target Device: {friendly_name} (ID: {device_name})
|
||||
Attribute to check: {attribute}
|
||||
|
||||
Instructions:
|
||||
1. The question must be in {self.language}.
|
||||
2. The question should be natural and conversational.
|
||||
3. Do not include the device ID.
|
||||
4. Provide ONLY the question text. Do not add quotes or explanations.
|
||||
"""
|
||||
else:
|
||||
# Fallback for unknown task types
|
||||
user_prompt = "Generate a random smart home command."
|
||||
|
||||
payload = {
|
||||
"model": self.model_name,
|
||||
"messages": [
|
||||
{"role": "system", "content": system_prompt},
|
||||
{"role": "user", "content": user_prompt}
|
||||
],
|
||||
"temperature": 1.0, # High temperature for diversity
|
||||
"max_tokens": 60,
|
||||
"stream": False
|
||||
}
|
||||
|
||||
try:
|
||||
async with session.post(LLM_ENDPOINT, json=payload) as response:
|
||||
if response.status == 200:
|
||||
data = await response.json()
|
||||
content = data['choices'][0]['message']['content'].strip()
|
||||
# Cleanup: remove leading/trailing quotes if present
|
||||
if content.startswith('"') and content.endswith('"'):
|
||||
content = content[1:-1]
|
||||
return content
|
||||
else:
|
||||
# print(f"Error from LLM: {response.status}")
|
||||
return None
|
||||
except Exception as e:
|
||||
print(f"Request failed: {e}")
|
||||
return None
|
||||
|
||||
async def generate_failed_tool_call_entry(self, session, context):
|
||||
service_name = context["service_name"]
|
||||
friendly_name = context["friendly_name"]
|
||||
correct_device = context["device_name"]
|
||||
action_description = self._describe_service(service_name, context.get("service_data", {}))
|
||||
device_list, device_types, extra_exposed_attributes = random_device_list(max_devices=10, avoid_device_names=[], language=self.language)
|
||||
|
||||
extra_phrase_instructions = ""
|
||||
if service_name == "climate.set_temperature":
|
||||
extra_phrase_instructions = "Always reference the target temperature using the literal placeholder <temp_f>."
|
||||
|
||||
system_prompt = "You create high-quality multilingual training data for a smart home assistant."
|
||||
user_prompt = f"""
|
||||
Generate content for a failed tool call in {self.language}.
|
||||
Service: {service_name}
|
||||
Action description: {action_description}
|
||||
Device name: {correct_device} (friendly name: {friendly_name})
|
||||
The assistant first misidentifies the entity using the "bad_device" name, receives an error, then retries with {correct_device}.
|
||||
Output a single JSON object with the keys "phrase", "bad_device", "error_result", and "retry_prompt".
|
||||
- phrase: A natural voice command template the user would say. {extra_phrase_instructions}
|
||||
- bad_device: The incorrect version of '{correct_device}'. Ensure it is a truncation, mutation, transposition, or inclusion of an extra suffix/prefix. Avoid simple typos in words.
|
||||
- retry_prompt: A short acknowledgement from the assistant that it will try the correct device ({correct_device}).
|
||||
|
||||
Here are potential device names to help generate a bad device name: {', '.join(device_list)}
|
||||
Keep the tone conversational and stay entirely in {self.language}. Do not add explanations or code fences.
|
||||
"""
|
||||
|
||||
raw = await self._chat_completion(
|
||||
session,
|
||||
system_prompt,
|
||||
user_prompt,
|
||||
temperature=0.7,
|
||||
max_tokens=512,
|
||||
structured_response={ "type": "json_object" }
|
||||
)
|
||||
parsed = self._parse_json_object(raw)
|
||||
if not parsed:
|
||||
print(f"Failed to parse JSON for failed tool call generation: {raw}")
|
||||
return None
|
||||
|
||||
phrase = parsed.get("phrase", "").strip()
|
||||
bad_device = parsed.get("bad_device", "").strip()
|
||||
retry_prompt = parsed.get("retry_prompt", "").strip()
|
||||
if not phrase or not bad_device or not retry_prompt:
|
||||
return None
|
||||
|
||||
return {
|
||||
"service_name": service_name,
|
||||
"correct_device_name": correct_device,
|
||||
"correct_friendly_name": friendly_name,
|
||||
"bad_device_name": bad_device,
|
||||
"phrase": phrase,
|
||||
"error_result": get_hass_match_error_message(bad_device),
|
||||
"retry_prompt": retry_prompt
|
||||
}
|
||||
|
||||
async def generate_refusal_entry(self, session, context, reason_type: str, desired_state: str):
|
||||
service_name = context["service_name"]
|
||||
friendly_name = context["friendly_name"]
|
||||
action_description = self._describe_service(service_name, context.get("service_data", {}))
|
||||
device_suffix = context["device_name"].split(".", 1)[1]
|
||||
|
||||
if reason_type == "not_available":
|
||||
reason_detail = "Explain that the assistant cannot locate that device in the home."
|
||||
else:
|
||||
reason_detail = f"Explain that the device is already {desired_state} and no change is needed."
|
||||
|
||||
system_prompt = "You write concise refusal-style responses for a multilingual smart home assistant."
|
||||
user_prompt = f"""
|
||||
Create a refusal example in {self.language} for the following request.
|
||||
Service: {service_name}
|
||||
Action description: {action_description}
|
||||
Reason: {reason_detail}
|
||||
Output a JSON object with:
|
||||
- "phrase": the user's natural command template. Use the literal placeholder <device_name> anywhere the user mentions the device.
|
||||
- "response": the assistant's refusal message in {self.language} describing the reason.
|
||||
Keep both fields brief, conversational, and free of extra narration or code fences.
|
||||
"""
|
||||
|
||||
raw = await self._chat_completion(
|
||||
session,
|
||||
system_prompt,
|
||||
user_prompt,
|
||||
temperature=0.7,
|
||||
max_tokens=512,
|
||||
structured_response={ "type": "json_object" }
|
||||
)
|
||||
parsed = self._parse_json_object(raw)
|
||||
if not parsed:
|
||||
print("Failed to parse JSON for refusal generation")
|
||||
return None
|
||||
|
||||
phrase = parsed.get("phrase", "").strip()
|
||||
response = parsed.get("response", "").strip()
|
||||
if not phrase or not response:
|
||||
return None
|
||||
|
||||
phrase = self._ensure_placeholder(phrase, friendly_name, "<device_name>")
|
||||
if "<device_name>" not in phrase:
|
||||
return None
|
||||
|
||||
return {
|
||||
"reason_type": reason_type,
|
||||
"service_name": service_name,
|
||||
"device_name": device_suffix,
|
||||
"friendly_name": friendly_name,
|
||||
"desired_state": desired_state if reason_type == "already_state" else "",
|
||||
"phrase": phrase,
|
||||
"response": response
|
||||
}
|
||||
|
||||
def sample_context(self, request_type: str):
|
||||
"""
|
||||
Creates a random scenario: device, service, and arguments.
|
||||
"""
|
||||
# 1. Pick a device from the loaded piles OR synthetic devices
|
||||
device_types = list(self.piles.stacks_of_device_names.keys())
|
||||
if not device_types:
|
||||
return None
|
||||
|
||||
dt = random.choice(device_types)
|
||||
|
||||
# Mix real and synthetic devices
|
||||
devices = self.piles.stacks_of_device_names[dt]
|
||||
if dt in self.synthetic_devices:
|
||||
devices = devices + self.synthetic_devices[dt]
|
||||
|
||||
if not devices:
|
||||
return None
|
||||
|
||||
device = random.choice(devices)
|
||||
device_name = device["device_name"]
|
||||
friendly_name = device["description"]
|
||||
|
||||
# Decide between Action and Status
|
||||
if request_type == "status":
|
||||
# Status Request
|
||||
# Determine available attributes based on domain
|
||||
domain = device_name.split(".")[0]
|
||||
attributes = ["state"] # Default
|
||||
if domain == "light":
|
||||
attributes.extend(["brightness", "color"])
|
||||
elif domain == "climate":
|
||||
attributes.extend(["temperature", "humidity", "hvac_mode"])
|
||||
elif domain == "media_player":
|
||||
attributes.extend(["volume", "media_title", "state"])
|
||||
elif domain == "cover":
|
||||
attributes.extend(["position", "state"])
|
||||
elif domain == "fan":
|
||||
attributes.extend(["speed", "state"])
|
||||
|
||||
attribute = random.choice(attributes)
|
||||
return {
|
||||
"type": "status",
|
||||
"device_name": device_name,
|
||||
"friendly_name": friendly_name,
|
||||
"attribute": attribute
|
||||
}
|
||||
|
||||
elif request_type == "action":
|
||||
# Action
|
||||
# 2. Pick a service compatible with this device type
|
||||
domain = device_name.split(".")[0]
|
||||
|
||||
services = []
|
||||
if domain == "light":
|
||||
services = ["light.turn_on", "light.turn_off", "light.toggle"]
|
||||
elif domain == "switch":
|
||||
services = ["switch.turn_on", "switch.turn_off", "switch.toggle"]
|
||||
elif domain == "cover":
|
||||
services = ["cover.open_cover", "cover.close_cover", "cover.stop_cover", "cover.toggle"]
|
||||
elif domain == "blinds":
|
||||
services = ["blinds.open_cover", "blinds.close_cover", "blinds.stop_cover", "blinds.toggle"]
|
||||
elif domain == "garage_door":
|
||||
services = ["garage_door.open_cover", "garage_door.close_cover", "garage_door.stop_cover", "garage_door.toggle"]
|
||||
elif domain == "fan":
|
||||
services = ["fan.turn_on", "fan.turn_off", "fan.toggle", "fan.increase_speed", "fan.decrease_speed"]
|
||||
elif domain == "climate":
|
||||
services = ["climate.turn_on", "climate.turn_off", "climate.set_temperature"]
|
||||
elif domain == "media_player":
|
||||
services = ["media_player.turn_on", "media_player.turn_off", "media_player.media_play_pause", "media_player.volume_up", "media_player.volume_down"]
|
||||
elif domain == "lock":
|
||||
services = ["lock.lock", "lock.unlock"]
|
||||
elif domain == "vacuum":
|
||||
services = ["vacuum.start", "vacuum.return_to_base", "vacuum.stop"]
|
||||
|
||||
if not services:
|
||||
return None
|
||||
|
||||
service_name = random.choice(services)
|
||||
|
||||
# 3. Generate Arguments
|
||||
service_data = {}
|
||||
if service_name == "light.turn_on":
|
||||
if random.random() < 0.3:
|
||||
service_data["brightness_pct"] = random.randint(10, 100)
|
||||
if random.random() < 0.3:
|
||||
# Simple colors
|
||||
colors = ["red", "blue", "green", "yellow", "purple", "white", "warm white", "cool white"]
|
||||
service_data["color_name"] = random.choice(colors)
|
||||
elif service_name == "climate.set_temperature":
|
||||
service_data["temperature"] = random.randint(18, 28)
|
||||
|
||||
return {
|
||||
"type": "action",
|
||||
"device_name": device_name,
|
||||
"friendly_name": friendly_name,
|
||||
"service_name": service_name,
|
||||
"service_data": service_data
|
||||
}
|
||||
raise ValueError(f"Unknown request type {request_type}")
|
||||
|
||||
async def run(self, num_actions: int, num_status_requests: int, num_devices: int,
|
||||
persona_name=None, persona_description=None, num_failed_tool_calls: int = 0,
|
||||
num_refusals: int = 0):
|
||||
print(f"Starting generation...")
|
||||
print(f"Language: {self.language}")
|
||||
|
||||
async with aiohttp.ClientSession() as session:
|
||||
|
||||
if num_devices > 0:
|
||||
print("Generating synthetic device names...")
|
||||
device_types = list(self.piles.stacks_of_device_names.keys())
|
||||
gen_tasks = []
|
||||
for dt in device_types:
|
||||
gen_tasks.append(self.generate_device_names(session, dt, count=num_devices))
|
||||
|
||||
generated_lists = await asyncio.gather(*gen_tasks)
|
||||
|
||||
# Flatten list and write to CSV
|
||||
all_new_devices = [item for sublist in generated_lists if sublist for item in sublist]
|
||||
|
||||
if all_new_devices:
|
||||
csv_path = f"{cwd}/piles/{self.language}/pile_of_device_names.csv"
|
||||
try:
|
||||
with open(csv_path, "a", newline='', encoding='utf-8') as f:
|
||||
writer = csv.DictWriter(f, fieldnames=["device_name", "description"])
|
||||
for device in all_new_devices:
|
||||
writer.writerow(device)
|
||||
print(f"Appended {len(all_new_devices)} new devices to {csv_path}")
|
||||
except Exception as e:
|
||||
print(f"Failed to write new devices to CSV: {e}")
|
||||
|
||||
if num_actions > 0 or num_status_requests > 0:
|
||||
print(f"Generating {num_actions} actions and {num_status_requests} status requests...")
|
||||
tasks = {}
|
||||
results = []
|
||||
|
||||
pbar = tqdm(total=num_actions + num_status_requests, desc="Generating phrases")
|
||||
|
||||
while len(results) < num_actions + num_status_requests:
|
||||
# Fill up the task queue
|
||||
while len(tasks) < self.concurrency and (len(results) + len(tasks)) < num_actions + num_status_requests:
|
||||
context = self.sample_context("action" if len(results) < num_actions else "status")
|
||||
if not context:
|
||||
continue
|
||||
|
||||
task = asyncio.create_task(self.generate_phrase(session, context))
|
||||
tasks[task] = context
|
||||
|
||||
if not tasks:
|
||||
break
|
||||
|
||||
# Wait for completed tasks
|
||||
done, pending = await asyncio.wait(tasks.keys(), return_when=asyncio.FIRST_COMPLETED)
|
||||
|
||||
for task in done:
|
||||
context = tasks.pop(task)
|
||||
try:
|
||||
phrase = await task
|
||||
if phrase:
|
||||
entry = context.copy()
|
||||
entry["phrase"] = phrase
|
||||
|
||||
if entry["type"] == "action":
|
||||
# Write to pile_of_specific_actions.csv
|
||||
csv_path = f"{cwd}/piles/{self.language}/pile_of_specific_actions.csv"
|
||||
|
||||
# Prepare row
|
||||
# device_name in CSV is the suffix (e.g. 'kitchen' from 'light.kitchen')
|
||||
# But wait, generate_data.py expects device_name to be the suffix ONLY if the domain matches the service domain?
|
||||
# Actually generate_data.py does: target_device = f"{device_type}.{action['device_name']}"
|
||||
# where device_type = service_name.split(".")[0]
|
||||
# So if service is light.turn_on, device_type is light.
|
||||
# If device is light.kitchen, action['device_name'] should be 'kitchen'.
|
||||
|
||||
full_device_name = entry["device_name"]
|
||||
service_name = entry["service_name"]
|
||||
service_domain = service_name.split(".")[0]
|
||||
device_domain = full_device_name.split(".")[0]
|
||||
|
||||
if service_domain != device_domain:
|
||||
# This might happen if we use a service from a different domain (e.g. homeassistant.turn_on)
|
||||
# But our sample_context ensures domain match (mostly).
|
||||
# For blinds/garage_door, we use blinds.open_cover etc.
|
||||
# So service_domain is blinds. device_domain is blinds.
|
||||
pass
|
||||
|
||||
device_suffix = full_device_name.split(".", 1)[1]
|
||||
|
||||
row = {
|
||||
"service_name": service_name,
|
||||
"device_name": device_suffix,
|
||||
"phrase": phrase,
|
||||
"arguments": json.dumps(entry["service_data"]) if entry["service_data"] else ""
|
||||
}
|
||||
|
||||
# Check if header needs update (only once)
|
||||
if not hasattr(self, "_action_header_updated"):
|
||||
self._action_header_updated = True
|
||||
# Read header
|
||||
with open(csv_path, "r", encoding='utf-8') as f:
|
||||
reader = csv.DictReader(f)
|
||||
all_rows = list(reader)
|
||||
current_fieldnames = reader.fieldnames if reader.fieldnames else []
|
||||
|
||||
fieldnames = list(current_fieldnames) + ["arguments"]
|
||||
with open(csv_path, "w", newline='', encoding='utf-8') as f:
|
||||
writer = csv.DictWriter(f, fieldnames=fieldnames)
|
||||
writer.writeheader()
|
||||
writer.writerows(all_rows)
|
||||
|
||||
with open(csv_path, "a", newline='', encoding='utf-8') as f:
|
||||
# We need to know fieldnames.
|
||||
# We can read them from file or assume standard + arguments.
|
||||
# Let's read them.
|
||||
with open(csv_path, "r", encoding='utf-8') as fr:
|
||||
reader = csv.reader(fr)
|
||||
header = next(reader)
|
||||
|
||||
writer = csv.DictWriter(f, fieldnames=header)
|
||||
writer.writerow(row)
|
||||
|
||||
elif entry["type"] == "status":
|
||||
# Write to pile_of_status_requests.csv
|
||||
# We need to templatize the phrase.
|
||||
# Replace friendly_name with <device_name>
|
||||
phrase_tmpl = phrase.replace(entry["friendly_name"], "<device_name>")
|
||||
# Also try case insensitive?
|
||||
phrase_tmpl = phrase_tmpl.replace(entry["friendly_name"].lower(), "<device_name>")
|
||||
|
||||
# If friendly name not found, maybe skip?
|
||||
if "<device_name>" not in phrase_tmpl:
|
||||
# Try to find partial match?
|
||||
# For now, just skip if we can't templatize.
|
||||
pass
|
||||
else:
|
||||
csv_path = f"{cwd}/piles/{self.language}/pile_of_status_requests.csv"
|
||||
# Columns: device_type,state,phrase,assistant_response
|
||||
# We don't have assistant_response.
|
||||
# We can generate a generic one?
|
||||
# Or ask LLM to generate it?
|
||||
# For now, let's skip status requests writing as we lack assistant_response.
|
||||
pass
|
||||
|
||||
results.append(entry)
|
||||
pbar.update(1)
|
||||
except Exception as e:
|
||||
print(f"Task error: {e}")
|
||||
|
||||
pbar.close()
|
||||
|
||||
if num_failed_tool_calls > 0:
|
||||
print(f"Generating {num_failed_tool_calls} failed tool call scenarios...")
|
||||
failed_entries = []
|
||||
tasks = {}
|
||||
pbar_failed = tqdm(total=num_failed_tool_calls, desc="Failed tool calls")
|
||||
|
||||
while len(failed_entries) < num_failed_tool_calls:
|
||||
while len(tasks) < self.concurrency and (len(failed_entries) + len(tasks)) < num_failed_tool_calls:
|
||||
context = self.sample_context("action")
|
||||
if not context:
|
||||
continue
|
||||
task = asyncio.create_task(self.generate_failed_tool_call_entry(session, context))
|
||||
tasks[task] = None
|
||||
|
||||
if not tasks:
|
||||
break
|
||||
|
||||
done, _ = await asyncio.wait(list(tasks.keys()), return_when=asyncio.FIRST_COMPLETED)
|
||||
|
||||
for task in done:
|
||||
tasks.pop(task, None)
|
||||
try:
|
||||
entry = await task
|
||||
except Exception as exc:
|
||||
print(f"Failed tool call task error: {exc}")
|
||||
entry = None
|
||||
if entry:
|
||||
failed_entries.append(entry)
|
||||
pbar_failed.update(1)
|
||||
|
||||
pbar_failed.close()
|
||||
failed_path = f"{cwd}/piles/{self.language}/pile_of_failed_tool_calls.csv"
|
||||
self._append_rows_to_csv(failed_path, self.failed_tool_fieldnames, failed_entries)
|
||||
|
||||
if num_refusals > 0:
|
||||
print(f"Generating {num_refusals} refusal scenarios...")
|
||||
refusal_entries = []
|
||||
tasks = {}
|
||||
pbar_refusals = tqdm(total=num_refusals, desc="Refusals")
|
||||
|
||||
while len(refusal_entries) < num_refusals:
|
||||
while len(tasks) < self.concurrency and (len(refusal_entries) + len(tasks)) < num_refusals:
|
||||
context = self.sample_context("action")
|
||||
if not context:
|
||||
continue
|
||||
reason_type = random.choice(["not_available", "already_state"])
|
||||
desired_state = ""
|
||||
if reason_type == "already_state":
|
||||
desired_state = self._desired_state_for_service(context["service_name"])
|
||||
if not desired_state:
|
||||
reason_type = "not_available"
|
||||
task = asyncio.create_task(self.generate_refusal_entry(
|
||||
session,
|
||||
context,
|
||||
reason_type,
|
||||
desired_state
|
||||
))
|
||||
tasks[task] = None
|
||||
|
||||
if not tasks:
|
||||
break
|
||||
|
||||
done, _ = await asyncio.wait(list(tasks.keys()), return_when=asyncio.FIRST_COMPLETED)
|
||||
|
||||
for task in done:
|
||||
tasks.pop(task, None)
|
||||
try:
|
||||
entry = await task
|
||||
except Exception as exc:
|
||||
print(f"Refusal generation error: {exc}")
|
||||
entry = None
|
||||
if entry:
|
||||
refusal_entries.append(entry)
|
||||
pbar_refusals.update(1)
|
||||
|
||||
pbar_refusals.close()
|
||||
refusal_path = f"{cwd}/piles/{self.language}/pile_of_refusals.csv"
|
||||
self._append_rows_to_csv(refusal_path, self.refusal_fieldnames, refusal_entries)
|
||||
|
||||
if persona_name and persona_description:
|
||||
await self.generate_persona(session, persona_name, persona_description)
|
||||
|
||||
print("Generation complete.")
|
||||
|
||||
async def generate_persona(self, session, persona_name, persona_description):
|
||||
print(f"Generating new persona: {persona_name}...")
|
||||
|
||||
# 1. Generate System Prompt
|
||||
sys_prompt_instruction = (
|
||||
f"Generate a system prompt for an AI assistant named '{persona_name}' "
|
||||
f"who has the following personality: {persona_description}. "
|
||||
"The prompt should define the persona's character and instructions. "
|
||||
"It should start with 'You are ...'. "
|
||||
"Keep it under 50 words."
|
||||
)
|
||||
|
||||
payload = {
|
||||
"model": self.model_name,
|
||||
"messages": [
|
||||
{"role": "system", "content": "You are an expert at creating AI system prompts."},
|
||||
{"role": "user", "content": sys_prompt_instruction}
|
||||
],
|
||||
"temperature": 0.7,
|
||||
"max_tokens": 100,
|
||||
}
|
||||
|
||||
system_prompt_text = ""
|
||||
try:
|
||||
async with session.post(LLM_ENDPOINT, json=payload) as response:
|
||||
if response.status == 200:
|
||||
data = await response.json()
|
||||
system_prompt_text = data['choices'][0]['message']['content'].strip()
|
||||
if system_prompt_text.startswith('"') and system_prompt_text.endswith('"'):
|
||||
system_prompt_text = system_prompt_text[1:-1]
|
||||
print(f"Generated system prompt: {system_prompt_text}")
|
||||
else:
|
||||
print(f"Failed to generate system prompt: {response.status}")
|
||||
return
|
||||
except Exception as e:
|
||||
print(f"System prompt generation failed: {e}")
|
||||
return
|
||||
|
||||
# 2. Get list of services to generate responses for
|
||||
responses_csv_path = f"{cwd}/piles/{self.language}/pile_of_responses.csv"
|
||||
services = set()
|
||||
try:
|
||||
with open(responses_csv_path, "r", encoding='utf-8') as f:
|
||||
reader = csv.DictReader(f)
|
||||
for row in reader:
|
||||
services.add(row["service"])
|
||||
except Exception as e:
|
||||
print(f"Failed to read responses CSV: {e}")
|
||||
return
|
||||
|
||||
print(f"Found {len(services)} unique services to generate responses for.")
|
||||
|
||||
# 3. Generate responses for each service
|
||||
new_responses = []
|
||||
|
||||
async def generate_service_responses(svc):
|
||||
# We want normal and short responses
|
||||
prompt = (
|
||||
f"You are acting as '{persona_name}', described as: {persona_description}.\n"
|
||||
f"Generate 3 diverse responses confirming that you are performing the action: '{svc}'.\n"
|
||||
"Then generate 3 SHORT/CONCISE responses for the same action.\n"
|
||||
"Format the output as follows:\n"
|
||||
"NORMAL: <response 1>\n"
|
||||
"NORMAL: <response 2>\n"
|
||||
"NORMAL: <response 3>\n"
|
||||
"SHORT: <short response 1>\n"
|
||||
"SHORT: <short response 2>\n"
|
||||
"SHORT: <short response 3>\n"
|
||||
"Do not include any other text."
|
||||
)
|
||||
|
||||
payload = {
|
||||
"model": self.model_name,
|
||||
"messages": [
|
||||
{"role": "system", "content": f"You are {persona_name}. {persona_description}"},
|
||||
{"role": "user", "content": prompt}
|
||||
],
|
||||
"temperature": 0.8,
|
||||
"max_tokens": 300,
|
||||
}
|
||||
|
||||
try:
|
||||
async with session.post(LLM_ENDPOINT, json=payload) as response:
|
||||
if response.status == 200:
|
||||
data = await response.json()
|
||||
content = data['choices'][0]['message']['content'].strip()
|
||||
lines = content.split('\n')
|
||||
for line in lines:
|
||||
line = line.strip()
|
||||
if line.startswith("NORMAL:"):
|
||||
text = line.replace("NORMAL:", "").strip()
|
||||
if text:
|
||||
new_responses.append({
|
||||
"service": svc,
|
||||
"response": text,
|
||||
"persona": persona_name,
|
||||
"short": 0
|
||||
})
|
||||
elif line.startswith("SHORT:"):
|
||||
text = line.replace("SHORT:", "").strip()
|
||||
if text:
|
||||
new_responses.append({
|
||||
"service": svc,
|
||||
"response": text,
|
||||
"persona": persona_name,
|
||||
"short": 1
|
||||
})
|
||||
except Exception as e:
|
||||
print(f"Failed to generate responses for {svc}: {e}")
|
||||
|
||||
# Run in batches
|
||||
tasks = []
|
||||
for svc in services:
|
||||
tasks.append(generate_service_responses(svc))
|
||||
if len(tasks) >= self.concurrency:
|
||||
await asyncio.gather(*tasks)
|
||||
tasks = []
|
||||
if tasks:
|
||||
await asyncio.gather(*tasks)
|
||||
|
||||
print(f"Generated {len(new_responses)} responses.")
|
||||
|
||||
# 4. Write to files
|
||||
# Append system prompt
|
||||
sys_prompts_path = f"{cwd}/piles/{self.language}/pile_of_system_prompts.csv"
|
||||
try:
|
||||
with open(sys_prompts_path, "a", newline='', encoding='utf-8') as f:
|
||||
writer = csv.writer(f)
|
||||
# Check if we need to add a newline if file doesn't end with one?
|
||||
# csv module handles newlines usually.
|
||||
writer.writerow([persona_name, system_prompt_text])
|
||||
print(f"Appended system prompt to {sys_prompts_path}")
|
||||
except Exception as e:
|
||||
print(f"Failed to write system prompt: {e}")
|
||||
|
||||
# Append responses
|
||||
try:
|
||||
with open(responses_csv_path, "a", newline='', encoding='utf-8') as f:
|
||||
fieldnames = ["service", "response", "persona", "short"]
|
||||
writer = csv.DictWriter(f, fieldnames=fieldnames)
|
||||
for resp in new_responses:
|
||||
writer.writerow(resp)
|
||||
print(f"Appended responses to {responses_csv_path}")
|
||||
except Exception as e:
|
||||
print(f"Failed to write responses: {e}")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
parser = argparse.ArgumentParser(description="Generate synthetic data using LLM")
|
||||
parser.add_argument("--actions", type=int, default=0, help="Number of actions to generate")
|
||||
parser.add_argument("--status", type=int, default=0, help="Number of status requests to generate")
|
||||
parser.add_argument("--devices", type=int, default=0, help="Number of new devices to generate")
|
||||
parser.add_argument("--failed-tool-calls", type=int, default=0, help="Number of failed tool call scenarios to generate")
|
||||
parser.add_argument("--refusals", type=int, default=0, help="Number of refusal scenarios to generate")
|
||||
parser.add_argument("--concurrency", type=int, default=4, help="Number of concurrent requests")
|
||||
parser.add_argument("--languages", type=str, nargs='+', default=["english"], help="Languages to generate data for")
|
||||
parser.add_argument("--model", type=str, default="gpt-oss-120b", help="LLM model to use")
|
||||
parser.add_argument("--persona-name", type=str, help="Name of the new persona to generate")
|
||||
parser.add_argument("--persona-description", type=str, help="Description of the new persona")
|
||||
|
||||
args = parser.parse_args()
|
||||
|
||||
for language in args.languages:
|
||||
print(f"=== Generating data for language: {language} ===")
|
||||
generator = SyntheticDataGenerator(model_name=args.model, language=language, concurrency=args.concurrency)
|
||||
asyncio.run(generator.run(
|
||||
num_actions=args.actions,
|
||||
num_status_requests=args.status,
|
||||
num_devices=args.devices,
|
||||
persona_name=args.persona_name,
|
||||
persona_description=args.persona_description,
|
||||
num_failed_tool_calls=args.failed_tool_calls,
|
||||
num_refusals=args.refusals
|
||||
))
|
||||
831
data/tools.py
Normal file
831
data/tools.py
Normal file
@@ -0,0 +1,831 @@
|
||||
# TOOLS
|
||||
TOOL_TURN_ON = "HassTurnOn"
|
||||
TOOL_TURN_OFF = "HassTurnOff"
|
||||
TOOL_TOGGLE = "HassToggle"
|
||||
TOOL_SET_POSITION = "HassSetPosition"
|
||||
TOOL_LIGHT_SET = "HassLightSet"
|
||||
TOOL_SET_VOLUME = "HassSetVolume"
|
||||
TOOL_MEDIA_UNPAUSE = "HassMediaUnpause"
|
||||
TOOL_MEDIA_PAUSE = "HassMediaPause"
|
||||
TOOL_MEDIA_NEXT = "HassMediaNext"
|
||||
TOOL_MEDIA_PREVIOUS = "HassMediaPrevious"
|
||||
TOOL_VACUUM_START = "HassVacuumStart"
|
||||
TOOL_VACUUM_RETURN_TO_BASE = "HassVacuumReturnToBase"
|
||||
TOOL_LIST_ADD_ITEM = "HassListAddItem"
|
||||
TOOL_START_TIMER = "HassStartTimer"
|
||||
TOOL_CANCEL_TIMER = "HassCancelTimer"
|
||||
TOOL_PAUSE_TIMER = "HassPauseTimer"
|
||||
TOOL_UNPAUSE_TIMER = "HassUnpauseTimer"
|
||||
TOOL_INCREASE_TIMER = "HassIncreaseTimer"
|
||||
TOOL_DECREASE_TIMER = "HassDecreaseTimer"
|
||||
TOOL_TIMER_STATUS = "HassTimerStatus"
|
||||
TOOL_CLIMATE_SET_TEMPERATURE = "HassClimateSetTemperature"
|
||||
TOOL_CLIMATE_GET_TEMPERATURE = "HassClimateGetTemperature"
|
||||
TOOL_SET_HUMIDITY = "HassHumidifierSetpoint"
|
||||
TOOL_SET_HUMIDIFIER_MODE = "HassHumidifierMode"
|
||||
|
||||
# Service name to tool name mapping for backwards compatibility with CSV files
|
||||
SERVICE_TO_TOOL_MAP = {
|
||||
"turn_on": TOOL_TURN_ON,
|
||||
"turn_off": TOOL_TURN_OFF,
|
||||
"toggle": TOOL_TOGGLE,
|
||||
"open_cover": TOOL_TURN_ON,
|
||||
"close_cover": TOOL_TURN_OFF,
|
||||
"stop_cover": TOOL_TOGGLE,
|
||||
"set_cover_position": TOOL_SET_POSITION,
|
||||
"lock": TOOL_TURN_ON,
|
||||
"unlock": TOOL_TURN_OFF,
|
||||
"increase_speed": TOOL_TURN_ON,
|
||||
"decrease_speed": TOOL_TURN_OFF,
|
||||
"media_stop": TOOL_TURN_OFF,
|
||||
"media_play_pause": TOOL_TOGGLE,
|
||||
"media_pause": TOOL_MEDIA_PAUSE,
|
||||
"media_play": TOOL_MEDIA_UNPAUSE,
|
||||
"media_next_track": TOOL_MEDIA_NEXT,
|
||||
"media_previous_track": TOOL_MEDIA_PREVIOUS,
|
||||
"start": TOOL_VACUUM_START,
|
||||
"return_to_base": TOOL_VACUUM_RETURN_TO_BASE,
|
||||
"set_temperature": TOOL_CLIMATE_SET_TEMPERATURE,
|
||||
"set_humidity": TOOL_SET_HUMIDITY,
|
||||
"set_hvac_mode": TOOL_CLIMATE_SET_TEMPERATURE,
|
||||
"set_fan_mode": TOOL_CLIMATE_SET_TEMPERATURE,
|
||||
"set_preset_mode": TOOL_CLIMATE_SET_TEMPERATURE,
|
||||
"cancel": TOOL_CANCEL_TIMER,
|
||||
"volume_down": TOOL_SET_VOLUME,
|
||||
"volume_up": TOOL_SET_VOLUME,
|
||||
"volume_mute": TOOL_SET_VOLUME,
|
||||
"stop": TOOL_TURN_OFF,
|
||||
"pause": TOOL_TURN_OFF,
|
||||
"add_item": TOOL_LIST_ADD_ITEM
|
||||
}
|
||||
|
||||
# Home Assistant Intent Tools Definition
|
||||
HASS_TOOLS = [
|
||||
{"function": {
|
||||
"name": TOOL_TURN_ON,
|
||||
"description": "Turns on/opens/unlocks a device or entity",
|
||||
"parameters": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"name": {"type": "string", "description": "Name of the device or entity"},
|
||||
"area": {"type": "string", "description": "Name of the area"},
|
||||
"floor": {"type": "string", "description": "Name of the floor"},
|
||||
"domain": {"type": "array", "items": {"type": "string"}, "description": "Device domain(s)"},
|
||||
"device_class": {"type": "array", "items": {"type": "string"}, "description": "Device class(es)"}
|
||||
},
|
||||
"required": []
|
||||
}
|
||||
}},
|
||||
{"function": {
|
||||
"name": TOOL_TURN_OFF,
|
||||
"description": "Turns off/closes/locks a device or entity",
|
||||
"parameters": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"name": {"type": "string", "description": "Name of the device or entity"},
|
||||
"area": {"type": "string", "description": "Name of the area"},
|
||||
"floor": {"type": "string", "description": "Name of the floor"},
|
||||
"domain": {"type": "array", "items": {"type": "string"}, "description": "Device domain(s)"},
|
||||
"device_class": {"type": "array", "items": {"type": "string"}, "description": "Device class(es)"}
|
||||
},
|
||||
"required": []
|
||||
}
|
||||
}},
|
||||
{"function": {
|
||||
"name": TOOL_TOGGLE,
|
||||
"description": "Toggles a device or entity",
|
||||
"parameters": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"name": {"type": "string", "description": "Name of the device or entity"},
|
||||
"area": {"type": "string", "description": "Name of the area"},
|
||||
"floor": {"type": "string", "description": "Name of the floor"},
|
||||
"domain": {"type": "array", "items": {"type": "string"}, "description": "Device domain(s)"},
|
||||
"device_class": {"type": "array", "items": {"type": "string"}, "description": "Device class(es)"}
|
||||
},
|
||||
"required": []
|
||||
}
|
||||
}},
|
||||
{"function": {
|
||||
"name": TOOL_SET_POSITION,
|
||||
"description": "Sets the position of a device or entity (e.g., blinds, covers)",
|
||||
"parameters": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"name": {"type": "string", "description": "Name of the device or entity"},
|
||||
"area": {"type": "string", "description": "Name of the area"},
|
||||
"floor": {"type": "string", "description": "Name of the floor"},
|
||||
"position": {"type": "integer", "description": "Position from 0-100", "minimum": 0, "maximum": 100}
|
||||
},
|
||||
"required": ["position"]
|
||||
}
|
||||
}},
|
||||
{"function": {
|
||||
"name": TOOL_LIGHT_SET,
|
||||
"description": "Sets the brightness or color of a light",
|
||||
"parameters": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"name": {"type": "string", "description": "Name of the light"},
|
||||
"area": {"type": "string", "description": "Name of the area"},
|
||||
"floor": {"type": "string", "description": "Name of the floor"},
|
||||
"color": {"type": "string", "description": "Color name"},
|
||||
"temperature": {"type": "integer", "description": "Color temperature in Kelvin"},
|
||||
"brightness": {"type": "integer", "description": "Brightness percentage (0-100)", "minimum": 0, "maximum": 100}
|
||||
},
|
||||
"required": []
|
||||
}
|
||||
}},
|
||||
{"function": {
|
||||
"name": TOOL_CLIMATE_SET_TEMPERATURE,
|
||||
"description": "Sets the target temperature of a climate device",
|
||||
"parameters": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"name": {"type": "string", "description": "Name of the climate device"},
|
||||
"area": {"type": "string", "description": "Name of the area"},
|
||||
"floor": {"type": "string", "description": "Name of the floor"},
|
||||
"temperature": {"type": "number", "description": "Target temperature"}
|
||||
},
|
||||
"required": ["temperature"]
|
||||
}
|
||||
}},
|
||||
{"function": {
|
||||
"name": TOOL_SET_HUMIDITY,
|
||||
"description": "Sets the target humidity level of a humidifier device",
|
||||
"parameters": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"name": {"type": "string", "description": "Name of the humidifier"},
|
||||
"humidity": {"type": "integer", "description": "Target humidity percentage (0-100)", "minimum": 0, "maximum": 100}
|
||||
},
|
||||
"required": ["name", "humidity"]
|
||||
}
|
||||
}},
|
||||
{"function": {
|
||||
"name": TOOL_SET_HUMIDIFIER_MODE,
|
||||
"description": "Sets the mode of a humidifier device",
|
||||
"parameters": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"name": {"type": "string", "description": "Name of the humidifier"},
|
||||
"mode": {"type": "string", "description": "Humidifier mode"}
|
||||
},
|
||||
"required": ["name", "mode"]
|
||||
}
|
||||
}},
|
||||
{"function": {
|
||||
"name": TOOL_MEDIA_UNPAUSE,
|
||||
"description": "Resumes playback on a media player",
|
||||
"parameters": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"name": {"type": "string", "description": "Name of the media player"},
|
||||
"area": {"type": "string", "description": "Name of the area"},
|
||||
"floor": {"type": "string", "description": "Name of the floor"}
|
||||
},
|
||||
"required": []
|
||||
}
|
||||
}},
|
||||
{"function": {
|
||||
"name": TOOL_MEDIA_PAUSE,
|
||||
"description": "Pauses playback on a media player",
|
||||
"parameters": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"name": {"type": "string", "description": "Name of the media player"},
|
||||
"area": {"type": "string", "description": "Name of the area"},
|
||||
"floor": {"type": "string", "description": "Name of the floor"}
|
||||
},
|
||||
"required": []
|
||||
}
|
||||
}},
|
||||
{"function": {
|
||||
"name": TOOL_MEDIA_NEXT,
|
||||
"description": "Skips to the next media item on a media player",
|
||||
"parameters": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"name": {"type": "string", "description": "Name of the media player"},
|
||||
"area": {"type": "string", "description": "Name of the area"},
|
||||
"floor": {"type": "string", "description": "Name of the floor"}
|
||||
},
|
||||
"required": []
|
||||
}
|
||||
}},
|
||||
{"function": {
|
||||
"name": TOOL_SET_VOLUME,
|
||||
"description": "Sets the volume of a media player",
|
||||
"parameters": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"name": {"type": "string", "description": "Name of the media player"},
|
||||
"area": {"type": "string", "description": "Name of the area"},
|
||||
"floor": {"type": "string", "description": "Name of the floor"},
|
||||
"volume_level": {"type": "number", "description": "Volume level (0.0-1.0)", "minimum": 0.0, "maximum": 1.0}
|
||||
},
|
||||
"required": ["volume_level"]
|
||||
}
|
||||
}},
|
||||
{"function": {
|
||||
"name": TOOL_VACUUM_START,
|
||||
"description": "Starts a vacuum",
|
||||
"parameters": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"name": {"type": "string", "description": "Name of the vacuum"},
|
||||
"area": {"type": "string", "description": "Name of the area"},
|
||||
"floor": {"type": "string", "description": "Name of the floor"}
|
||||
},
|
||||
"required": []
|
||||
}
|
||||
}},
|
||||
{"function": {
|
||||
"name": TOOL_VACUUM_RETURN_TO_BASE,
|
||||
"description": "Returns a vacuum to its base",
|
||||
"parameters": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"name": {"type": "string", "description": "Name of the vacuum"},
|
||||
"area": {"type": "string", "description": "Name of the area"},
|
||||
"floor": {"type": "string", "description": "Name of the floor"}
|
||||
},
|
||||
"required": []
|
||||
}
|
||||
}},
|
||||
{"function": {
|
||||
"name": TOOL_LIST_ADD_ITEM,
|
||||
"description": "Adds an item to a todo list",
|
||||
"parameters": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"item": {"type": "string", "description": "The item to add to the list"},
|
||||
"name": {"type": "string", "description": "Name of the todo list"}
|
||||
},
|
||||
"required": ["item"]
|
||||
}
|
||||
}},
|
||||
{"function": {
|
||||
"name": TOOL_START_TIMER,
|
||||
"description": "Starts a timer",
|
||||
"parameters": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"name": {"type": "string", "description": "Name of the timer"},
|
||||
"duration": {"type": "string", "description": "Timer duration (HH:MM:SS format)"}
|
||||
},
|
||||
"required": []
|
||||
}
|
||||
}},
|
||||
{"function": {
|
||||
"name": TOOL_CANCEL_TIMER,
|
||||
"description": "Cancels a timer",
|
||||
"parameters": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"name": {"type": "string", "description": "Name of the timer"}
|
||||
},
|
||||
"required": []
|
||||
}
|
||||
}},
|
||||
{"function": {
|
||||
"name": TOOL_PAUSE_TIMER,
|
||||
"description": "Pauses a timer",
|
||||
"parameters": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"name": {"type": "string", "description": "Name of the timer"}
|
||||
},
|
||||
"required": []
|
||||
}
|
||||
}},
|
||||
{"function": {
|
||||
"name": TOOL_UNPAUSE_TIMER,
|
||||
"description": "Resumes a paused timer",
|
||||
"parameters": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"name": {"type": "string", "description": "Name of the timer"}
|
||||
},
|
||||
"required": []
|
||||
}
|
||||
}}
|
||||
]
|
||||
|
||||
SERVICE_TOOL_ALLOWED_SERVICES = ["turn_on", "turn_off", "toggle", "press", "increase_speed", "decrease_speed", "open_cover", "close_cover", "stop_cover", "lock", "unlock",
|
||||
"start", "stop", "return_to_base", "pause", "cancel", "add_item", "set_temperature", "set_humidity", "set_fan_mode", "set_hvac_mode", "set_preset_mode"]
|
||||
SERVICE_TOOL_ALLOWED_DOMAINS = ["light", "switch", "button", "fan", "cover", "lock", "media_player", "climate", "vacuum", "todo", "timer", "script"]
|
||||
|
||||
SERVICE_TOOLS = [
|
||||
{"function": {
|
||||
"name": "<sample>",
|
||||
"description": "",
|
||||
"parameters": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"target_device": {"type": "string", "description": "The target device to turn on"},
|
||||
"rgb_color": {"type": "string", "description": "The RGB color to set"},
|
||||
"brightness": {"type": "number", "description": "The brightness level"},
|
||||
"temperature": {"type": "number", "description": "The temperature level"},
|
||||
"humidity": {"type": "number", "description": "The humidity level"},
|
||||
"fan_mode": {"type": "string", "description": "The fan mode"},
|
||||
"hvac_mode": {"type": "string", "description": "The HVAC mode"},
|
||||
"preset_mode": {"type": "string", "description": "The preset mode"},
|
||||
"duration": {"type": "string", "description": "The amount of time to apply to the chosen timer"},
|
||||
"item": {"type": "string", "description": "The item to add to the list"}
|
||||
},
|
||||
"required": [
|
||||
"target_device"
|
||||
]
|
||||
}
|
||||
}},
|
||||
{"function": {
|
||||
"name": "light.turn_on",
|
||||
"description": "",
|
||||
"parameters": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"target_device": {"type": "string", "description": "The target device to turn on"},
|
||||
"rgb_color": {"type": "string", "description": "The RGB color to set"},
|
||||
"brightness": {"type": "number", "description": "The brightness level"},
|
||||
},
|
||||
"required": [
|
||||
"target_device"
|
||||
]
|
||||
}
|
||||
}},
|
||||
{"function": {
|
||||
"name": "light.turn_off",
|
||||
"description": "",
|
||||
"parameters": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"target_device": {"type": "string", "description": "The target device to turn off"},
|
||||
},
|
||||
"required": [
|
||||
"target_device"
|
||||
]
|
||||
}
|
||||
}},
|
||||
{"function": {
|
||||
"name": "light.toggle",
|
||||
"description": "",
|
||||
"parameters": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"target_device": {"type": "string", "description": "The target device to toggle"},
|
||||
},
|
||||
"required": [
|
||||
"target_device"
|
||||
]
|
||||
}
|
||||
}},
|
||||
{"function": {
|
||||
"name": "switch.turn_on",
|
||||
"description": "",
|
||||
"parameters": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"target_device": {"type": "string", "description": "The target device to turn on"},
|
||||
},
|
||||
"required": [
|
||||
"target_device"
|
||||
]
|
||||
}
|
||||
}},
|
||||
{"function": {
|
||||
"name": "switch.turn_off",
|
||||
"description": "",
|
||||
"parameters": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"target_device": {"type": "string", "description": "The target device to turn off"},
|
||||
},
|
||||
"required": [
|
||||
"target_device"
|
||||
]
|
||||
}
|
||||
}},
|
||||
{"function": {
|
||||
"name": "switch.toggle",
|
||||
"description": "",
|
||||
"parameters": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"target_device": {"type": "string", "description": "The target device to toggle"},
|
||||
},
|
||||
"required": [
|
||||
"target_device"
|
||||
]
|
||||
}
|
||||
}},
|
||||
{"function": {
|
||||
"name": "fan.turn_on",
|
||||
"description": "",
|
||||
"parameters": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"target_device": {"type": "string", "description": "The target device to turn on"},
|
||||
},
|
||||
"required": [
|
||||
"target_device"
|
||||
]
|
||||
}
|
||||
}},
|
||||
{"function": {
|
||||
"name": "fan.turn_off",
|
||||
"description": "",
|
||||
"parameters": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"target_device": {"type": "string", "description": "The target device to turn off"},
|
||||
},
|
||||
"required": [
|
||||
"target_device"
|
||||
]
|
||||
}
|
||||
}},
|
||||
{"function": {
|
||||
"name": "fan.toggle",
|
||||
"description": "",
|
||||
"parameters": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"target_device": {"type": "string", "description": "The target device to toggle"},
|
||||
},
|
||||
"required": [
|
||||
"target_device"
|
||||
]
|
||||
}
|
||||
}},
|
||||
{"function": {
|
||||
"name": "fan.set_speed",
|
||||
"description": "",
|
||||
"parameters": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"target_device": {"type": "string", "description": "The target device to set speed"},
|
||||
"fan_mode": {"type": "string", "description": "The fan mode"},
|
||||
},
|
||||
"required": [
|
||||
"target_device",
|
||||
"fan_mode"
|
||||
]
|
||||
}
|
||||
}},
|
||||
{"function": {
|
||||
"name": "fan.increase_speed",
|
||||
"description": "",
|
||||
"parameters": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"target_device": {"type": "string", "description": "The target device to increase speed"},
|
||||
},
|
||||
"required": [
|
||||
"target_device"
|
||||
]
|
||||
}
|
||||
}},
|
||||
{"function": {
|
||||
"name": "fan.decrease_speed",
|
||||
"description": "",
|
||||
"parameters": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"target_device": {"type": "string", "description": "The target device to decrease speed"},
|
||||
},
|
||||
"required": [
|
||||
"target_device"
|
||||
]
|
||||
}
|
||||
}},
|
||||
{"function": {
|
||||
"name": "button.press",
|
||||
"description": "",
|
||||
"parameters": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"target_device": {"type": "string", "description": "The target device to press"},
|
||||
},
|
||||
"required": [
|
||||
"target_device"
|
||||
]
|
||||
}
|
||||
}},
|
||||
{"function": {
|
||||
"name": "cover.open_cover",
|
||||
"description": "",
|
||||
"parameters": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"target_device": {"type": "string", "description": "The target device to open"},
|
||||
},
|
||||
"required": [
|
||||
"target_device"
|
||||
]
|
||||
}
|
||||
}},
|
||||
{"function": {
|
||||
"name": "cover.close_cover",
|
||||
"description": "",
|
||||
"parameters": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"target_device": {"type": "string", "description": "The target device to close"},
|
||||
},
|
||||
"required": [
|
||||
"target_device"
|
||||
]
|
||||
}
|
||||
}},
|
||||
{"function": {
|
||||
"name": "cover.stop_cover",
|
||||
"description": "",
|
||||
"parameters": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"target_device": {"type": "string", "description": "The target device to stop"},
|
||||
},
|
||||
"required": [
|
||||
"target_device"
|
||||
]
|
||||
}
|
||||
}},
|
||||
{"function": {
|
||||
"name": "cover.set_cover_position",
|
||||
"description": "",
|
||||
"parameters": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"target_device": {"type": "string", "description": "The target device to set position"},
|
||||
"position": {"type": "integer", "description": "Position from 0-100", "minimum": 0, "maximum": 100}
|
||||
},
|
||||
"required": [
|
||||
"target_device",
|
||||
"position"
|
||||
]
|
||||
}
|
||||
}},
|
||||
{"function": {
|
||||
"name": "lock.unlock",
|
||||
"description": "",
|
||||
"parameters": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"target_device": {"type": "string", "description": "The target device to unlock"},
|
||||
},
|
||||
"required": [
|
||||
"target_device"
|
||||
]
|
||||
}
|
||||
}},
|
||||
{"function": {
|
||||
"name": "lock.lock",
|
||||
"description": "",
|
||||
"parameters": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"target_device": {"type": "string", "description": "The target device to lock"},
|
||||
},
|
||||
"required": [
|
||||
"target_device"
|
||||
]
|
||||
}
|
||||
}},
|
||||
{"function": {
|
||||
"name": "vacuum.start",
|
||||
"description": "",
|
||||
"parameters": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"target_device": {"type": "string", "description": "The target device to start"},
|
||||
},
|
||||
"required": [
|
||||
"target_device"
|
||||
]
|
||||
}
|
||||
}},
|
||||
{"function": {
|
||||
"name": "vacuum.stop",
|
||||
"description": "",
|
||||
"parameters": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"target_device": {"type": "string", "description": "The target device to stop"},
|
||||
},
|
||||
"required": [
|
||||
"target_device"
|
||||
]
|
||||
}
|
||||
}},
|
||||
{"function": {
|
||||
"name": "vacuum.return_to_base",
|
||||
"description": "",
|
||||
"parameters": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"target_device": {"type": "string", "description": "The target device to return to base"},
|
||||
},
|
||||
"required": [
|
||||
"target_device"
|
||||
]
|
||||
}
|
||||
}},
|
||||
{"function": {
|
||||
"name": "media_player.media_play_pause",
|
||||
"description": "",
|
||||
"parameters": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"target_device": {"type": "string", "description": "The target media player to play/pause"},
|
||||
},
|
||||
"required": [
|
||||
"target_device"
|
||||
]
|
||||
}
|
||||
}},
|
||||
{"function": {
|
||||
"name": "media_player.media_pause",
|
||||
"description": "",
|
||||
"parameters": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"target_device": {"type": "string", "description": "The target media player to pause"},
|
||||
},
|
||||
"required": [
|
||||
"target_device"
|
||||
]
|
||||
}
|
||||
}},
|
||||
{"function": {
|
||||
"name": "media_player.media_play",
|
||||
"description": "",
|
||||
"parameters": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"target_device": {"type": "string", "description": "The target media player to play"},
|
||||
},
|
||||
"required": [
|
||||
"target_device"
|
||||
]
|
||||
}
|
||||
}},
|
||||
{"function": {
|
||||
"name": "media_player.media_next_track",
|
||||
"description": "",
|
||||
"parameters": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"target_device": {"type": "string", "description": "The target media player to skip to next track"},
|
||||
},
|
||||
"required": [
|
||||
"target_device"
|
||||
]
|
||||
}
|
||||
}},
|
||||
{"function": {
|
||||
"name": "media_player.media_previous_track",
|
||||
"description": "",
|
||||
"parameters": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"target_device": {"type": "string", "description": "The target media player to skip to previous track"},
|
||||
},
|
||||
"required": [
|
||||
"target_device"
|
||||
]
|
||||
}
|
||||
}},
|
||||
{"function": {
|
||||
"name": "media_player.volume_set",
|
||||
"description": "",
|
||||
"parameters": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"target_device": {"type": "string", "description": "The target media player to set volume"},
|
||||
"volume_level": {"type": "number", "description": "Volume level (0.0-1.0)", "minimum": 0.0, "maximum": 1.0}
|
||||
},
|
||||
"required": [
|
||||
"target_device",
|
||||
"volume_level"
|
||||
]
|
||||
}
|
||||
}},
|
||||
{"function": {
|
||||
"name": "todo.add_item",
|
||||
"description": "",
|
||||
"parameters": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"target_device": {"type": "string", "description": "The target todo list to add item to"},
|
||||
"item": {"type": "string", "description": "The item to add to the list"}
|
||||
},
|
||||
"required": [
|
||||
"target_device",
|
||||
"item"
|
||||
]
|
||||
}
|
||||
}},
|
||||
{"function": {
|
||||
"name": "timer.start",
|
||||
"description": "",
|
||||
"parameters": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"target_device": {"type": "string", "description": "The target timer to start"},
|
||||
"duration": {"type": "string", "description": "Timer duration (HH:MM:SS format)"}
|
||||
},
|
||||
"required": [
|
||||
"target_device"
|
||||
]
|
||||
}
|
||||
}},
|
||||
{"function": {
|
||||
"name": "timer.cancel",
|
||||
"description": "",
|
||||
"parameters": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"target_device": {"type": "string", "description": "The target timer to cancel"},
|
||||
},
|
||||
"required": [
|
||||
"target_device"
|
||||
]
|
||||
}
|
||||
}},
|
||||
{"function": {
|
||||
"name": "climate.set_temperature",
|
||||
"description": "",
|
||||
"parameters": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"target_device": {"type": "string", "description": "The target climate device to set temperature"},
|
||||
"temperature": {"type": "number", "description": "Target temperature"}
|
||||
},
|
||||
"required": [
|
||||
"target_device",
|
||||
"temperature"
|
||||
]
|
||||
}
|
||||
}},
|
||||
{"function": {
|
||||
"name": "climate.set_humidity",
|
||||
"description": "",
|
||||
"parameters": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"target_device": {"type": "string", "description": "The target humidifier device to set humidity"},
|
||||
"humidity": {"type": "integer", "description": "Target humidity percentage (0-100)", "minimum": 0, "maximum": 100}
|
||||
},
|
||||
"required": [
|
||||
"target_device",
|
||||
"humidity"
|
||||
]
|
||||
}
|
||||
}},
|
||||
{"function": {
|
||||
"name": "climate.set_hvac_mode",
|
||||
"description": "",
|
||||
"parameters": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"target_device": {"type": "string", "description": "The target climate device to set HVAC mode"},
|
||||
"hvac_mode": {"type": "string", "description": "The HVAC mode"}
|
||||
},
|
||||
"required": [
|
||||
"target_device",
|
||||
"hvac_mode"
|
||||
]
|
||||
}
|
||||
}},
|
||||
{"function": {
|
||||
"name": "climate.set_preset_mode",
|
||||
"description": "",
|
||||
"parameters": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"target_device": {"type": "string", "description": "The target climate device to set preset mode"},
|
||||
"preset_mode": {"type": "string", "description": "The preset mode"}
|
||||
},
|
||||
"required": [
|
||||
"target_device",
|
||||
"preset_mode"
|
||||
]
|
||||
}
|
||||
}},
|
||||
{"function": {
|
||||
"name": "climate.set_fan_mode",
|
||||
"description": "",
|
||||
"parameters": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"target_device": {"type": "string", "description": "The target climate device to set fan mode"},
|
||||
"fan_mode": {"type": "string", "description": "The fan mode"}
|
||||
},
|
||||
"required": [
|
||||
"target_device",
|
||||
"fan_mode"
|
||||
]
|
||||
}
|
||||
}}
|
||||
]
|
||||
259
data/utils.py
Normal file
259
data/utils.py
Normal file
@@ -0,0 +1,259 @@
|
||||
import random
|
||||
import re
|
||||
import os
|
||||
import csv
|
||||
from typing import Any, TypedDict
|
||||
import pandas
|
||||
from datetime import datetime, timedelta
|
||||
import webcolors
|
||||
|
||||
class NoResponseAvailableException(Exception):
|
||||
pass
|
||||
|
||||
class NoServicesAvailableException(Exception):
|
||||
pass
|
||||
|
||||
|
||||
def closest_color(requested_color: tuple[int, int, int]):
|
||||
min_colors: dict[int, str] = {}
|
||||
color_names = webcolors.names("css3")
|
||||
|
||||
for name in color_names:
|
||||
r_c, g_c, b_c = webcolors.name_to_rgb(name)
|
||||
rd = (r_c - requested_color[0]) ** 2
|
||||
gd = (g_c - requested_color[1]) ** 2
|
||||
bd = (b_c - requested_color[2]) ** 2
|
||||
min_colors[(rd + gd + bd)] = name
|
||||
return min_colors[min(min_colors.keys())]
|
||||
|
||||
def generate_random_datetime():
|
||||
start_date = datetime(2022, 1, 1)
|
||||
end_date = datetime(2030, 12, 31)
|
||||
delta = end_date - start_date
|
||||
random_days = random.randint(0, delta.days)
|
||||
random_seconds = random.randint(0, 24 * 60 * 60)
|
||||
random_date_time = start_date + timedelta(days=random_days, seconds=random_seconds)
|
||||
return random_date_time
|
||||
|
||||
var_pattern = re.compile("<(.*?)>")
|
||||
def get_included_vars(response: str):
|
||||
result = []
|
||||
for var in var_pattern.findall(response):
|
||||
if var == "device_name":
|
||||
continue
|
||||
result.append(var)
|
||||
|
||||
return ",".join(sorted(result))
|
||||
|
||||
def generate_random_parameter(param_name: str, piles_of_data: "DatasetPiles"):
|
||||
RANDOM_PARAMETER_GENERATORS = {
|
||||
"rgb_color": lambda: (random.randint(0, 255), random.randint(0, 255), random.randint(0, 255)),
|
||||
"brightness": lambda: random.randint(0, 100),
|
||||
"fan_mode": lambda: random.choice(["On Low", "On High", "Auto Low", "Auto High", "Off"]),
|
||||
"temp_f": lambda: random.randint(60, 80),
|
||||
"temp_c": lambda: random.randint(15, 25),
|
||||
"humidity": lambda: random.randint(10, 90),
|
||||
"preset_mode": lambda: random.choice(["home", "eco", "away", "auto"]),
|
||||
"hvac_mode": lambda: random.choice(["heat", "cool", "heat_cool", "off", "auto", "fan_only"]),
|
||||
"media": lambda: random.choice(piles_of_data["pile_of_media_names"]),
|
||||
"volume": lambda: round(random.random(), 2),
|
||||
"duration": lambda: random.choice(list(piles_of_data["pile_of_durations"].keys())),
|
||||
"remaining": lambda: f"{random.randint(0, 3):02}:{random.randint(0, 60)}:{random.randint(0, 60)}",
|
||||
"todo": lambda: random.choice(piles_of_data["pile_of_todo_items"]),
|
||||
}
|
||||
param_generator = RANDOM_PARAMETER_GENERATORS.get(param_name)
|
||||
|
||||
if not param_generator:
|
||||
raise Exception(f"Unknown param to generate random value for {param_name}")
|
||||
|
||||
return param_generator()
|
||||
|
||||
def get_random_response(pile_of_responses: pandas.DataFrame, *, service: str, persona: str, question_template: str, short: bool) -> tuple[str, str]:
|
||||
|
||||
required_vars = list(set([var for var in var_pattern.findall(question_template) if "device_name" not in var]))
|
||||
|
||||
possible_results = pile_of_responses.loc[(pile_of_responses['service']==service) &
|
||||
(pile_of_responses['persona']==persona) &
|
||||
(pile_of_responses['short']==(1 if short else 0)) &
|
||||
(pile_of_responses['contains_vars']==",".join(sorted(required_vars)))
|
||||
]
|
||||
|
||||
if len(possible_results) == 0:
|
||||
raise NoResponseAvailableException(f"No responses matched the provided filters: {persona}, {service}, {required_vars}, {short}")
|
||||
|
||||
return possible_results.sample()["response_starting"].values[0], possible_results.sample()["response_confirmed"].values[0]
|
||||
|
||||
|
||||
class PileOfDeviceType(TypedDict):
|
||||
device_name: str
|
||||
description: str
|
||||
type: str
|
||||
|
||||
|
||||
class PileOfSpecificActionType(TypedDict):
|
||||
service_name: str
|
||||
device_name: str
|
||||
phrase: str
|
||||
|
||||
|
||||
class PileOfTemplatedActionType(TypedDict):
|
||||
device_type: str
|
||||
service: str
|
||||
phrase: str
|
||||
multiplier: int
|
||||
|
||||
|
||||
class PileOfStatusRequestType(TypedDict):
|
||||
device_type: str
|
||||
state: str
|
||||
phrase: str
|
||||
assistant_response: str
|
||||
|
||||
|
||||
class PileOfHallucinatedServiceType(TypedDict):
|
||||
real_service: str
|
||||
hallucinated_service: str
|
||||
|
||||
|
||||
class PileOfFailedToolcallType(TypedDict):
|
||||
service_name: str
|
||||
correct_device_name: str
|
||||
correct_friendly_name: str
|
||||
bad_device_name: str
|
||||
phrase: str
|
||||
error_result: str
|
||||
retry_prompt: str
|
||||
|
||||
|
||||
class PileOfRefusalsType(TypedDict):
|
||||
reason_type: str
|
||||
service_name: str
|
||||
device_name: str
|
||||
friendly_name: str
|
||||
desired_state: str
|
||||
phrase: str
|
||||
response: str
|
||||
|
||||
|
||||
class DatasetPiles:
|
||||
def __init__(self, supported_devices, language="english"):
|
||||
self.language = language
|
||||
|
||||
cwd = os.path.dirname(__file__)
|
||||
|
||||
with open(f"{cwd}/piles/{language}/pile_of_and_words.csv", encoding="utf8") as f:
|
||||
self.and_words = [ x.strip() for x in f.readlines() ]
|
||||
|
||||
with open(f"{cwd}/piles/{language}/pile_of_durations.csv", encoding="utf8") as f:
|
||||
reader = csv.DictReader(f)
|
||||
self.pile_of_durations: dict[str, str] = { x["duration"]: x["name"] for x in reader }
|
||||
|
||||
# media names are not translated
|
||||
with open(f"{cwd}/piles/english/pile_of_media_names.txt", encoding="utf8") as f:
|
||||
self.pile_of_media_names = [ x.strip() for x in f.readlines() ]
|
||||
|
||||
with open(f"{cwd}/piles/{language}/pile_of_todo_items.txt", encoding="utf8") as f:
|
||||
self.pile_of_todo_items = [ x.strip() for x in f.readlines() ]
|
||||
|
||||
self.stacks_of_device_names: dict[str, list[PileOfDeviceType]] = { x: [] for x in supported_devices }
|
||||
with open(f"{cwd}/piles/{language}/pile_of_device_names.csv", encoding="utf8") as f:
|
||||
reader = csv.DictReader(f)
|
||||
pile_of_device_names = list(reader)
|
||||
for device_dict in pile_of_device_names:
|
||||
try:
|
||||
device_type = device_dict["device_name"].split(".")[0]
|
||||
device_dict["type"] = device_type
|
||||
self.stacks_of_device_names[device_type].append(device_dict) # type: ignore
|
||||
except KeyError as ex:
|
||||
print(ex)
|
||||
|
||||
with open(f"{cwd}/piles/{language}/pile_of_templated_actions.csv", encoding="utf8") as f:
|
||||
reader = csv.DictReader(f)
|
||||
pile_of_templated_actions = list(reader)
|
||||
processed_pile_of_templated_actions = []
|
||||
for action in pile_of_templated_actions:
|
||||
try:
|
||||
multiplier = int(action["multiplier"])
|
||||
except Exception:
|
||||
raise Exception(f"line has a bad multiplier: {action}")
|
||||
for x in range(multiplier):
|
||||
processed_pile_of_templated_actions.append(action)
|
||||
|
||||
self.pile_of_templated_actions: list[PileOfTemplatedActionType] = processed_pile_of_templated_actions
|
||||
|
||||
with open(f"{cwd}/piles/{language}/pile_of_specific_actions.csv", encoding="utf8") as f:
|
||||
reader = csv.DictReader(f)
|
||||
self.pile_of_specific_actions: list[PileOfSpecificActionType] = list(reader) # type: ignore
|
||||
|
||||
self.pile_of_responses = pandas.read_csv(f"{cwd}/piles/{language}/pile_of_responses.csv")
|
||||
self.pile_of_responses["contains_vars"] = self.pile_of_responses["response_starting"].apply(get_included_vars)
|
||||
|
||||
with open(f"{cwd}/piles/{language}/pile_of_status_requests.csv", encoding="utf8") as f:
|
||||
reader = csv.DictReader(f)
|
||||
self.pile_of_status_requests: list[PileOfStatusRequestType] = list(reader) # type: ignore
|
||||
|
||||
with open(f"{cwd}/piles/{language}/pile_of_system_prompts.csv", encoding="utf8") as f:
|
||||
reader = csv.DictReader(f)
|
||||
self.pile_of_system_prompts: dict[str, str] = { line["persona"]: line["prompt"] for line in reader }
|
||||
|
||||
# service names are not translated
|
||||
with open(f"{cwd}/piles/english/pile_of_hallucinated_service_names.csv", encoding="utf8") as f:
|
||||
reader = csv.DictReader(f)
|
||||
self.pile_of_hallucinated_service_names: list[PileOfHallucinatedServiceType] = list(reader) # type: ignore
|
||||
|
||||
failed_tool_calls_path = f"{cwd}/piles/{language}/pile_of_failed_tool_calls.csv"
|
||||
self.pile_of_failed_tool_calls = []
|
||||
if os.path.exists(failed_tool_calls_path):
|
||||
with open(failed_tool_calls_path, encoding="utf8") as f:
|
||||
reader = csv.DictReader(f)
|
||||
self.pile_of_failed_tool_calls: list[PileOfFailedToolcallType] = list(reader) # type: ignore
|
||||
|
||||
refusals_path = f"{cwd}/piles/{language}/pile_of_refusals.csv"
|
||||
self.pile_of_refusals = []
|
||||
if os.path.exists(refusals_path):
|
||||
with open(refusals_path, encoding="utf8") as f:
|
||||
reader = csv.DictReader(f)
|
||||
self.pile_of_refusals: list[PileOfRefusalsType] = list(reader) # type: ignore
|
||||
|
||||
def __getitem__(self, key):
|
||||
return getattr(self, key)
|
||||
|
||||
_piles_cache = {}
|
||||
|
||||
def get_dataset_piles(language: str) -> DatasetPiles:
|
||||
if language not in _piles_cache:
|
||||
_piles_cache[language] = DatasetPiles( [
|
||||
"light", "switch", "fan", "garage_door", "blinds",
|
||||
"lock","media_player", "climate", "vacuum", "timer", "todo",
|
||||
], language)
|
||||
return _piles_cache[language]
|
||||
|
||||
|
||||
|
||||
class ToolCall(TypedDict):
|
||||
tool_name: str
|
||||
service_name: str
|
||||
tool_args: dict[str, Any]
|
||||
|
||||
|
||||
class ToolResult(TypedDict):
|
||||
tool_name: str
|
||||
tool_result: str
|
||||
|
||||
class AssistantTurn(TypedDict):
|
||||
answer: str
|
||||
tool_call_sequence: list[ToolCall]
|
||||
tool_results: list[ToolResult]
|
||||
train_on_turn: bool
|
||||
|
||||
|
||||
class Example(TypedDict):
|
||||
states: list[str]
|
||||
available_tools: list[str]
|
||||
question: str
|
||||
assistant_turns: list[AssistantTurn]
|
||||
|
||||
|
||||
class DatasetEntry(TypedDict):
|
||||
messages: list[dict[str, Any]]
|
||||
tools: list[dict[str, Any]]
|
||||
367
docs/Training.md
367
docs/Training.md
@@ -1,367 +0,0 @@
|
||||
# Training new model
|
||||
|
||||
## Initial requirements
|
||||
|
||||
Before you start training you model you should prepare data. One off the way to prepare data is run script `data/generate_home_assistant_data.py`. Currently this script support english, french, german, polish and spanish language. This is not the only way and you can prepare your own data. More details can be found in the file [HOW TO PREPARE DATA](../data/README.md).
|
||||
|
||||
|
||||
## Training
|
||||
|
||||
Before you will prepare your local environment and install all necessary libraries. You will need a graphics card with significant VRAM (16GB+) to effectively train the new model. If you have less VRAM you may be able to perform a LoRA fine tuning, but this will be less effective.
|
||||
|
||||
Start by installing system dependencies (assumes Ubuntu):
|
||||
`sudo apt-get install python3-dev`
|
||||
|
||||
Then create a Python virtual environment and install all necessary libraries:
|
||||
```
|
||||
python3 -m venv .train_data
|
||||
source ./.train_data/bin/activate
|
||||
pip3 install datasets==2.20.0 dataclasses==0.6 transformers==4.43.3 torch==2.4.0 accelerate==0.33.0 tensorboard==2.17.0 peft==0.12.0 bitsandbytes==0.43.3 trl==0.9.6
|
||||
```
|
||||
|
||||
### Prepare your model
|
||||
|
||||
Select which model you need to train: e.g. `TinyLlama/TinyLlama-1.1B-Chat-v1.0`. Remember that the choice of model depends on the VRAM your graphics card. If the model is larger, it is worth using the LoRA configuration which will allow you to train your model.
|
||||
|
||||
Run train.py script to start Fine Tuning with selected model and prepared data. It is worth experimenting with several parameters to choose the best model. Few example with some params you can find below.
|
||||
|
||||
### Example training runs
|
||||
|
||||
#### Phi Series
|
||||
**Phi Modules (for lora fine-tuning)**
|
||||
- MLP: fc1,fc2
|
||||
- MHA: q_proj,v_proj,k_proj,dense
|
||||
- Embeddings: embed_tokens (input) lm_head (output)
|
||||
|
||||
```console
|
||||
python3 train.py \
|
||||
--run_name home-phi3-mini-rev1 \
|
||||
--base_model microsoft/Phi-3-mini-4k-instruct \
|
||||
--bf16 \
|
||||
--train_dataset data/home_assistant_train.jsonl \
|
||||
--test_dataset data/home_assistant_test.jsonl \
|
||||
--learning_rate 5e-6 --batch_size 32 \
|
||||
--micro_batch_size 8 --gradient_checkpointing --group_by_length \
|
||||
--ctx_size 2048 --save_steps 100 --save_total_limit 10
|
||||
```
|
||||
|
||||
```console
|
||||
python3 train.py \
|
||||
--run_name Home-3B-v2_ha-GGUF \
|
||||
--base_model microsoft/phi-2 \
|
||||
--add_pad_token \
|
||||
--add_chatml_tokens \
|
||||
--bf16 \
|
||||
--train_dataset data/home_assistant_train.jsonl \
|
||||
--learning_rate 1e-5 \
|
||||
--save_steps 1000 \
|
||||
--micro_batch_size 2 --gradient_checkpointing \
|
||||
--ctx_size 2048 \
|
||||
--use_lora --lora_rank 32 --lora_alpha 64 --lora_modules fc1,fc2,q_proj,v_proj,dense --lora_modules_to_save embed_tokens,lm_head --lora_merge
|
||||
```
|
||||
|
||||
```console
|
||||
python3 train.py \
|
||||
--run_name home-1b-rev6 \
|
||||
--base_model microsoft/phi-1_5 \
|
||||
--add_pad_token \
|
||||
--add_chatml_tokens \
|
||||
--bf16 \
|
||||
--train_dataset data/home_assistant_train.jsonl \
|
||||
--test_dataset data/home_assistant_test.jsonl \
|
||||
--learning_rate 1e-5 \
|
||||
--micro_batch_size 4 --gradient_checkpointing \
|
||||
--ctx_size 2048 --save_steps 200
|
||||
```
|
||||
|
||||
#### StableLM series
|
||||
**StableLM modules (for lora fine-tuning)**
|
||||
- MLP: up_proj,down_proj,gate_proj
|
||||
- MHA: q_proj,v_proj,k_proj,o_proj
|
||||
- Embeddings: embed_tokens (input) lm_head (output)
|
||||
|
||||
```console
|
||||
python3 train.py \
|
||||
--run_name stablehome-1_6b-rev3 \
|
||||
--base_model stabilityai/stablelm-2-zephyr-1_6b \
|
||||
--bf16 \
|
||||
--train_dataset data/home_assistant_train.jsonl \
|
||||
--test_dataset data/home_assistant_test.jsonl \
|
||||
--learning_rate 1e-5 --batch_size 32 \
|
||||
--micro_batch_size 2 --gradient_checkpointing --group_by_length \
|
||||
--ctx_size 2048 --save_steps 100 --save_total_limit 20
|
||||
```
|
||||
|
||||
```console
|
||||
accelerate launch --config_file fsdp_config.yaml train.py \
|
||||
--run_name stablehome-3b-rev10 \
|
||||
--base_model stabilityai/stablelm-zephyr-3b \
|
||||
--bf16 \
|
||||
--train_dataset data/home_assistant_train.jsonl \
|
||||
--learning_rate 1e-5 --batch_size 64 --epochs 1 \
|
||||
--micro_batch_size 2 --gradient_checkpointing --group_by_length \
|
||||
--ctx_size 2048 \
|
||||
--save_steps 50 --save_total_limit 10 --eval_steps 100 --logging_steps 2
|
||||
```
|
||||
|
||||
```console
|
||||
python3 train.py \
|
||||
--run_name stablehome-3b-rev9-dpo \
|
||||
--base_model ./models/stablehome-3b-rev9/ \
|
||||
--bf16 \
|
||||
--train_dataset data/home_assistant_dpo.jsonl \
|
||||
--learning_rate 2e-7 --batch_size 16 --epochs 1 \
|
||||
--dpo --beta 0.1 --dpo_loss sigmoid \
|
||||
--micro_batch_size 1 --gradient_checkpointing \
|
||||
--ctx_size 2048 \
|
||||
--save_steps 50 --save_total_limit 10 --eval_steps 100 --logging_steps 2
|
||||
```
|
||||
|
||||
```console
|
||||
python3 train.py \
|
||||
--run_name stablehome-3b-rev8 \
|
||||
--base_model stabilityai/stablelm-zephyr-3b \
|
||||
--bf16 \
|
||||
--train_dataset data/home_assistant_train.jsonl \
|
||||
--test_dataset data/home_assistant_test.jsonl \
|
||||
--learning_rate 1e-5 --batch_size 128 --epochs 2 \
|
||||
--micro_batch_size 8 --gradient_checkpointing \
|
||||
--ctx_size 2048 \
|
||||
--save_steps 50 --save_total_limit 20 --eval_steps 100 --logging_steps 2 \
|
||||
--use_lora --lora_rank 64 --lora_alpha 128 --lora_modules up_proj,down_proj,q_proj,v_proj,o_proj --lora_merge
|
||||
```
|
||||
|
||||
#### Llama 3 8B Instruct:
|
||||
|
||||
```console
|
||||
python3 train.py \
|
||||
--run_name llamahome-8b-rev1 \
|
||||
--base_model NousResearch/Meta-Llama-3-8B-Instruct \
|
||||
--bf16 \
|
||||
--train_dataset data/home_assistant_train.jsonl \
|
||||
--test_dataset data/home_assistant_test.jsonl \
|
||||
--learning_rate 1e-5 --learning_rate_warmup 0.03 --batch_size 64 --epochs 1 \
|
||||
--micro_batch_size 2 --gradient_checkpointing --group_by_length \
|
||||
--ctx_size 2048 \
|
||||
--save_steps 25 --save_total_limit 20 --eval_steps 100 --logging_steps 2 \
|
||||
--use_lora --lora_rank 32 --lora_alpha 64 --lora_modules up_proj,down_proj,q_proj,v_proj,o_proj
|
||||
```
|
||||
|
||||
#### Llama 2 7B:
|
||||
|
||||
```console
|
||||
python3 train.py \
|
||||
--run_name home-7b-rev2 \
|
||||
--base_model TheBloke/Llama-2-7B-GPTQ \
|
||||
--train_dataset data/home_assistant_train.jsonl \
|
||||
--test_dataset data/home_assistant_test.jsonl \
|
||||
--load_as_gptq --use_lora --gradient_checkpointing \
|
||||
--add_pad_token --bf16 --micro_batch_size 4 --learning_rate 2e-5
|
||||
```
|
||||
|
||||
#### Bielik 7B Instruct:
|
||||
|
||||
```console
|
||||
python3 train.py \
|
||||
--run_name mistralhome-bielik-rev1 \
|
||||
--base_model speakleash/Bielik-7B-Instruct-v0.1 \
|
||||
--bf16 \
|
||||
--train_dataset data/home_assistant_train.jsonl \
|
||||
--test_dataset data/home_assistant_test.jsonl \
|
||||
--learning_rate 1e-5 --learning_rate_warmup 0.03 --batch_size 64 --epochs 1 \
|
||||
--micro_batch_size 4 --gradient_checkpointing --group_by_length \
|
||||
--ctx_size 2048 \
|
||||
--save_steps 50 --save_total_limit 20 --eval_steps 200 --logging_steps 1 \
|
||||
--use_lora --lora_rank 32 --lora_alpha 64 --lora_modules up_proj,down_proj,q_proj,v_proj,o_proj --load_in_4bit
|
||||
```
|
||||
|
||||
#### TinyLlama:
|
||||
|
||||
```console
|
||||
python3 train.py \
|
||||
--run_name tinyhome-rev4 \
|
||||
--base_model TinyLlama/TinyLlama-1.1B-Chat-v1.0 \
|
||||
--bf16 \
|
||||
--train_dataset data/home_assistant_train.jsonl \
|
||||
--test_dataset data/home_assistant_test.jsonl \
|
||||
--learning_rate 2e-5 --batch_size 32 \
|
||||
--micro_batch_size 8 --gradient_checkpointing --group_by_length \
|
||||
--ctx_size 2048 --save_steps 100 --save_total_limit 10
|
||||
```
|
||||
|
||||
#### Qwen2 0.5B Instruct:
|
||||
|
||||
```console
|
||||
python3 train.py \
|
||||
--run_name tinyhome-qwen-rev3 \
|
||||
--base_model Qwen/Qwen2-0.5B-Instruct \
|
||||
--bf16 \
|
||||
--train_dataset data/home_assistant_train.jsonl \
|
||||
--test_dataset data/home_assistant_test.jsonl \
|
||||
--learning_rate 2e-5 --batch_size 64 \
|
||||
--micro_batch_size 8 --gradient_checkpointing --group_by_length \
|
||||
--ctx_size 2048 --save_steps 1000
|
||||
```
|
||||
|
||||
#### polka 1.1b chat:
|
||||
|
||||
```console
|
||||
python3 train.py \
|
||||
--run_name tinyhome-polish-rev1 \
|
||||
--base_model eryk-mazus/polka-1.1b-chat \
|
||||
--bf16 \
|
||||
--train_dataset data/home_assistant_train.jsonl \
|
||||
--test_dataset data/home_assistant_test.jsonl \
|
||||
--learning_rate 2e-5 --batch_size 32 \
|
||||
--micro_batch_size 8 --gradient_checkpointing --group_by_length \
|
||||
--ctx_size 2048 --save_steps 100 --save_total_limit 10
|
||||
```
|
||||
|
||||
```console
|
||||
python3 train.py \
|
||||
--run_name tinyhome-rev2-dpo \
|
||||
--base_model ./models/tinyhome-rev2/ \
|
||||
--bf16 \
|
||||
--train_dataset data/home_assistant_dpo.jsonl \
|
||||
--learning_rate 5e-7 --batch_size 16 --epochs 1 \
|
||||
--dpo --beta 0.1 --dpo_loss sigmoid --learning_rate_warmup 0.03 \
|
||||
--micro_batch_size 2 --gradient_checkpointing \
|
||||
--ctx_size 2048 \
|
||||
--save_steps 50 --save_total_limit 10 --eval_steps 100 --logging_steps 2
|
||||
```
|
||||
|
||||
#### Llama 3.2 3B Instruct
|
||||
```
|
||||
python3 generate_home_assistant_data.py --train --test --large --sharegpt --language english german french spanish polish
|
||||
|
||||
python3 train.py \
|
||||
--run_name Home-Llama-3.2-3B-rev2 \
|
||||
--base_model meta-llama/Llama-3.2-3B-Instruct \
|
||||
--bf16 \
|
||||
--train_dataset data/home_assistant_train_large.jsonl \
|
||||
--test_dataset data/home_assistant_test.jsonl \
|
||||
--learning_rate 1e-5 --learning_rate_warmup 0.03 --batch_size 64 --epochs 1 \
|
||||
--micro_batch_size 1 \
|
||||
--ctx_size 2048 \
|
||||
--save_steps 200 --save_total_limit 1 --eval_steps 100 --logging_steps 2
|
||||
```
|
||||
|
||||
### Problems
|
||||
|
||||
Training a model is not an easy thing. Therefore, we are not able to cover all the problems encountered during training. Here we will try to add known problems and solutions on how to deal with them.
|
||||
|
||||
1. Problem with incorrect recognizing prefix_ids and suffix_ids
|
||||
|
||||
When you ran the script and in the logs you will see this kind of logs:
|
||||
|
||||
```console
|
||||
...
|
||||
[[128000, 128006, 9125, 128007, 271, 41, 18223, 7545, ... Lots more numbers ..., 128009, 128006, 78191, 128007, 271]]
|
||||
warning! example had no assistant response in it!
|
||||
...
|
||||
```
|
||||
|
||||
The script is printing the warning along with the tokenized version of the example that is being trained on. This is to help determine what the correct prefix_ids and suffix_ids.
|
||||
|
||||
The idea is that the training script need to build a mask (array) that is True for all of the tokens that the assistant would respond with, and False for all of the tokens that the user inputted or was included in the system prompt. We don't want to train the model to reproduce those tokens because it is a waste of computation power and can also confuse the model. This is the biggest difference between pre-training an LLM and performing Supervised Fine Tuning. In pre-training you train the model on the entire example (mask is True for all tokens).
|
||||
|
||||
The training script here attempts to auto-detect which tokens are for the assistant, but that is not trivial, and sometimes you need to manually provide the tokens that start an assistant response, and the tokens that end an assistant response.
|
||||
|
||||
For a model like TinyLlama that uses Zephyr format, the prefix is `<|assistant|>\n` and the suffix is `</s>`. That ends up equating to `[29966, 29989, 465, 22137, 29989, 29958, 13]` and `[2]` as the prefix and suffix tokens respectively (the suffix token is actually just the end of sentence/eos token in this case but is not always true for all chat models)
|
||||
|
||||
The other issue is that tokenizers perform differently based on if a token is preceded by white-space or if it is adjacent to the token that came before it. For example, check out https://gpt-tokenizer.dev/ to mess around with the GPT tokenizers. Try tokenizing the word `Computerwiz`. You will see that it returns 2 tokens: `[50411, 146049]` split up with `Computer` and `wiz`. Now if you split the word up with a space as Computer wiz, you would expect there to be 3 tokens now, the same 2 tokens from before separated by the "space" token. Instead you get back 2 tokens `[50411, 121731]`. The first token is the same, but the second token has "consumed" the space we inserted and is now a totally different token. This means that figuring out the exact prefix and suffix IDs can be a bit hard to do without the full prompt assembled and all of the spaces, newlines, and tabs that are part of the full chat template.
|
||||
|
||||
There is a script included in this repo that shows this and can assist in determining the correct prefix and suffix tokens for your model: [find_split.py](/find_split.py)
|
||||
|
||||
Example to use the script:
|
||||
|
||||
```console
|
||||
python3 find_split.py NousResearch/Meta-Llama-3.1-8B-Instruct
|
||||
```
|
||||
|
||||
On the console you will see this output:
|
||||
|
||||
```console
|
||||
None of PyTorch, TensorFlow >= 2.0, or Flax have been found. Models won't be available and only tokenizers, configuration and file/data utilities can be used.
|
||||
tokenizer_config.json: 100%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 50.9k/50.9k [00:00<00:00, 516kB/s]
|
||||
tokenizer.json: 100%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 9.09M/9.09M [00:17<00:00, 510kB/s]
|
||||
special_tokens_map.json: 100%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 296/296 [00:00<00:00, 1.06MB/s]
|
||||
Estimated tokens for NousResearch/Meta-Llama-3.1-8B-Instruct
|
||||
response prefix:
|
||||
<|start_header_id|>assistant<|end_header_id|>
|
||||
|
||||
|
||||
tokens with no leading whitespace: [128006, 78191, 128007, 271]
|
||||
tokens with leading whitespace: [220, 128006, 78191, 128007, 271]
|
||||
tokens with leading newline: [198, 128006, 78191, 128007, 271]
|
||||
---------------
|
||||
response suffix:
|
||||
<|eot_id|><|start_header_id|>assistant<|end_header_id|>
|
||||
|
||||
|
||||
tokens with no leading whitespace: [128009, 128006, 78191, 128007, 271]
|
||||
tokens with leading whitespace: [220, 128009, 128006, 78191, 128007, 271]
|
||||
tokens with leading newline: [198, 128009, 128006, 78191, 128007, 271]
|
||||
---------------
|
||||
'no whitespace' found the assistant response!
|
||||
--prefix-ids 128006,78191,128007,271
|
||||
--suffix-ids 128009,128006,78191,128007,271
|
||||
'leading space' did not find the assistant response
|
||||
'leading newline' did not find the assistant response
|
||||
```
|
||||
|
||||
After that you should add extra parameters to you script for properly set those params. This is Supervised Fine Tuning params for correctly hide requests for the model. You probably see several examples of tokens which script give you, it is worth looking for the indicated tokens in your log and checking which value will be correct (You should be able to find them). In case above the correct values is:
|
||||
|
||||
```
|
||||
prefix_ids = [128006, 78191, 128007, 271]
|
||||
suffix_ids = [128009, 128006, 78191, 128007, 271]
|
||||
```
|
||||
|
||||
You can add the provided arguments to your training run:
|
||||
|
||||
```
|
||||
python3 train.py \
|
||||
...
|
||||
--prefix_ids 128006,78191,128007,271 \
|
||||
--suffix_ids 128009,128006,78191,128007,271
|
||||
```
|
||||
|
||||
#### Known prefix and suffix IDs
|
||||
|
||||
tinyllama:
|
||||
```console
|
||||
python3 train.py \
|
||||
...
|
||||
--prefix_ids 29966,29989,465,22137,29989,29958,13 \
|
||||
--suffix_ids 2
|
||||
```
|
||||
|
||||
qwen2:
|
||||
```console
|
||||
python3 train.py \
|
||||
...
|
||||
--prefix_ids 151644,77091,198 \
|
||||
--suffix_ids 151645,198
|
||||
```
|
||||
|
||||
polka-1.1:
|
||||
```console
|
||||
python3 train.py \
|
||||
...
|
||||
--prefix_ids 43883,20255,13 \
|
||||
--suffix_ids 43882,29871,13
|
||||
```
|
||||
|
||||
Llama-3-8B-Instruct:
|
||||
```console
|
||||
python3 train.py \
|
||||
...
|
||||
--prefix-ids 128006,78191,128007,271 \
|
||||
--suffix-ids 128009,128006,78191,128007,271
|
||||
```
|
||||
|
||||
## Worth reading:
|
||||
|
||||
* [Fine-tune Llama 3.1 Ultra-Efficiently with Unsloth](https://mlabonne.github.io/blog/posts/2024-07-29_Finetune_Llama31.html)
|
||||
* [Fine-tune Mistral-7b with Direct Preference Optimization](https://mlabonne.github.io/blog/posts/Fine_tune_Mistral_7b_with_DPO.html)
|
||||
* [Quantize Llama models with GGUF and llama.cpp](https://mlabonne.github.io/blog/posts/Quantize_Llama_2_models_using_ggml.html)
|
||||
211
find_split.py
211
find_split.py
@@ -1,211 +0,0 @@
|
||||
# this script attempts to figure out the correct prefix_ids and suffix_ids for the given model
|
||||
# usage: python3 find_split.py <model name>
|
||||
from transformers import AutoTokenizer
|
||||
from jinja2.exceptions import TemplateError
|
||||
import sys
|
||||
|
||||
if len(sys.argv) > 1:
|
||||
model = sys.argv[1]
|
||||
else:
|
||||
print(f"Usage: {sys.argv[0]} <model name>")
|
||||
exit(-1)
|
||||
|
||||
prefix_ids = None
|
||||
suffix_ids = None
|
||||
tokenizer = AutoTokenizer.from_pretrained(model, trust_remote_code=True)
|
||||
|
||||
test_prompt = tokenizer.apply_chat_template(
|
||||
conversation=[
|
||||
{"role": "user", "content": r"HA_REQUEST"},
|
||||
{"role": "assistant", "content": r"HA_RESPONSE"}
|
||||
],
|
||||
tokenize=False,
|
||||
add_generation_prompt=False,
|
||||
)
|
||||
|
||||
print("Chat template:")
|
||||
print("-" * 100)
|
||||
print(test_prompt)
|
||||
print("-" * 100)
|
||||
|
||||
# Added real example to test the tokenizer
|
||||
test_prompt_tokens = tokenizer.apply_chat_template(
|
||||
conversation=[
|
||||
{"role": "system", "content": "this is a system prompt"},
|
||||
{"role": "user", "content": "a user request goes here"},
|
||||
{"role": "assistant", "content": "the response is in here"}
|
||||
],
|
||||
tokenize=True,
|
||||
add_generation_prompt=False
|
||||
)
|
||||
|
||||
print("Chat template tokens:")
|
||||
print("-" * 100)
|
||||
print(test_prompt_tokens)
|
||||
print("-" * 100)
|
||||
|
||||
try:
|
||||
assistant_prompt = tokenizer.apply_chat_template(
|
||||
conversation=[{"role": "assistant", "content": r"%%%%%%%%%%%%%%%%"}],
|
||||
tokenize=False,
|
||||
add_generation_prompt=False,
|
||||
).split( r"%%%%%%%%%%%%%%%%")
|
||||
except TemplateError:
|
||||
user_prompt = tokenizer.apply_chat_template(
|
||||
conversation=[
|
||||
{"role": "user", "content": r"$$$$$$$$$$$$$$$$"}
|
||||
],
|
||||
tokenize=False,
|
||||
add_generation_prompt=True,
|
||||
)
|
||||
# some prompt templates require user/assistant alternating
|
||||
assistant_prompt = tokenizer.apply_chat_template(
|
||||
conversation=[
|
||||
{"role": "user", "content": r"$$$$$$$$$$$$$$$$"},
|
||||
{"role": "assistant", "content": r"%%%%%%%%%%%%%%%%"},
|
||||
],
|
||||
tokenize=False,
|
||||
add_generation_prompt=True,
|
||||
).split(r"$$$$$$$$$$$$$$$$")[-1].strip().split(r"%%%%%%%%%%%%%%%%")
|
||||
|
||||
response_prefix = assistant_prompt[0]
|
||||
response_suffix = assistant_prompt[1]
|
||||
|
||||
# check for inserted system prompt and remove it
|
||||
if tokenizer.eos_token in response_prefix:
|
||||
response_prefix = response_prefix.split(tokenizer.eos_token)[-1].lstrip()
|
||||
|
||||
# some chat templates ALWAYS add the bos token
|
||||
if tokenizer.bos_token in response_prefix:
|
||||
response_prefix = response_prefix.replace(tokenizer.bos_token, "")
|
||||
|
||||
prefix_ids = tokenizer(response_prefix, add_special_tokens=False)["input_ids"]
|
||||
suffix_ids = tokenizer(response_suffix, add_special_tokens=False)["input_ids"]
|
||||
|
||||
prefix_ids2 = tokenizer(" " + response_prefix, add_special_tokens=False)["input_ids"]
|
||||
suffix_ids2 = tokenizer(" " + response_suffix, add_special_tokens=False)["input_ids"]
|
||||
|
||||
prefix_ids3 = tokenizer("\n" + response_prefix, add_special_tokens=False)["input_ids"]
|
||||
suffix_ids3 = tokenizer("\n" + response_suffix, add_special_tokens=False)["input_ids"]
|
||||
|
||||
prefix_ids4 = tokenizer(response_prefix.strip(), add_special_tokens=False)["input_ids"]
|
||||
suffix_ids4 = tokenizer(response_suffix.strip(), add_special_tokens=False)["input_ids"]
|
||||
|
||||
print(f"Estimated tokens for {model}")
|
||||
print("response prefix:")
|
||||
print(response_prefix)
|
||||
print("tokens with no leading whitespace:", prefix_ids)
|
||||
print("tokens with leading whitespace:", prefix_ids2)
|
||||
print("tokens with leading newline:", prefix_ids3)
|
||||
print("tokens with stripped whitespace:", prefix_ids4)
|
||||
|
||||
print("-" * 100)
|
||||
|
||||
print("response suffix:")
|
||||
print(response_suffix)
|
||||
print("tokens with no leading whitespace:", suffix_ids)
|
||||
print("tokens with leading whitespace:", suffix_ids2)
|
||||
print("tokens with leading newline:", suffix_ids3)
|
||||
print("tokens with stripped whitespace:", suffix_ids4)
|
||||
|
||||
|
||||
def _find_mask_ranges(input_ids, prefix_ids, suffix_ids):
|
||||
"""
|
||||
Returns a mask that blocks out everything but the response from the assistant
|
||||
The mask does NOT include the response_prefix but DOES include the response_suffix.
|
||||
The resulting behavior is the model uses the prefix as a prompt and the suffix as the end of text token
|
||||
"""
|
||||
ranges = []
|
||||
i = 0
|
||||
|
||||
while i < len(input_ids):
|
||||
try:
|
||||
# Find the start index of the prefix
|
||||
start_idx = input_ids.index(prefix_ids[0], i)
|
||||
except ValueError:
|
||||
break
|
||||
|
||||
# Check if the entire prefix is present
|
||||
if input_ids[start_idx:start_idx + len(prefix_ids)] == prefix_ids:
|
||||
end_prefix_idx = start_idx + len(prefix_ids)
|
||||
start_response_idx = end_prefix_idx + 1
|
||||
|
||||
# Find the start index of the suffix
|
||||
try:
|
||||
# Find the start index of the suffix
|
||||
suffix_start_idx = input_ids.index(suffix_ids[0], end_prefix_idx)
|
||||
except ValueError:
|
||||
ranges.append((start_response_idx, len(input_ids)))
|
||||
break
|
||||
|
||||
# Check if the entire suffix is present
|
||||
if input_ids[suffix_start_idx:suffix_start_idx + len(suffix_ids)] == suffix_ids:
|
||||
ranges.append((start_response_idx, suffix_start_idx))
|
||||
i = suffix_start_idx + len(suffix_ids)
|
||||
else:
|
||||
i = suffix_start_idx + 1
|
||||
else:
|
||||
i = start_idx + 1
|
||||
|
||||
inverse_ranges = []
|
||||
current = 0
|
||||
|
||||
for start, end in sorted(ranges):
|
||||
if start > current:
|
||||
inverse_ranges.append((current, start - 1))
|
||||
current = max(current, end + 1)
|
||||
|
||||
if current < len(input_ids):
|
||||
inverse_ranges.append((current, len(input_ids) - 1))
|
||||
|
||||
return inverse_ranges
|
||||
|
||||
try:
|
||||
label = tokenizer.apply_chat_template(
|
||||
conversation=[
|
||||
{"role": "system", "content": "this is a system prompt"},
|
||||
{"role": "user", "content": "a user request goes here"},
|
||||
{"role": "assistant", "content": "the response is in here"}
|
||||
],
|
||||
add_generation_prompt=False,
|
||||
)
|
||||
except TemplateError:
|
||||
# some chat templates don't have a system prompt option
|
||||
label = tokenizer.apply_chat_template(
|
||||
conversation=[
|
||||
{"role": "user", "content": "a user request goes here"},
|
||||
{"role": "assistant", "content": "the response is in here"}
|
||||
],
|
||||
add_generation_prompt=False,
|
||||
)
|
||||
|
||||
def check_range(label, name, prefix_ids, suffix_ids):
|
||||
label = label[:]
|
||||
mask_ranges = _find_mask_ranges(label, prefix_ids, suffix_ids)
|
||||
|
||||
found = False
|
||||
for start, end in mask_ranges:
|
||||
if end - start == len(label) - 1:
|
||||
print(f"'{name}' did not find the assistant response")
|
||||
else:
|
||||
found = True
|
||||
# label[start:end] = [-100] * (end - start)
|
||||
|
||||
# assistant_tokens = [x for x in label if x != -100]
|
||||
# decoded_string = tokenizer.decode(assistant_tokens)
|
||||
# expected_decoded_string = "the response is in here" + tokenizer.decode(suffix_ids)
|
||||
# if decoded_string == expected_decoded_string:
|
||||
# found = True
|
||||
|
||||
if found:
|
||||
print(f"'{name}' found the assistant response!")
|
||||
print(f"\t--prefix_ids {','.join([str(x) for x in prefix_ids])}")
|
||||
print(f"\t--suffix_ids {','.join([str(x) for x in suffix_ids])}")
|
||||
# else:
|
||||
# print(f"'{decoded_string}' != '{expected_decoded_string}'")
|
||||
|
||||
print("-" * 100)
|
||||
check_range(label, "no added whitespace", prefix_ids, suffix_ids)
|
||||
check_range(label, "leading space", prefix_ids2, suffix_ids2)
|
||||
check_range(label, "leading newline", prefix_ids3, suffix_ids3)
|
||||
check_range(label, "stripped whitespace", prefix_ids4, suffix_ids4)
|
||||
@@ -1,26 +0,0 @@
|
||||
compute_environment: LOCAL_MACHINE
|
||||
debug: false
|
||||
distributed_type: FSDP
|
||||
downcast_bf16: 'no'
|
||||
enable_cpu_affinity: false
|
||||
fsdp_config:
|
||||
fsdp_auto_wrap_policy: TRANSFORMER_BASED_WRAP
|
||||
fsdp_backward_prefetch: BACKWARD_PRE
|
||||
fsdp_cpu_ram_efficient_loading: true
|
||||
fsdp_forward_prefetch: true
|
||||
fsdp_offload_params: false
|
||||
fsdp_sharding_strategy: FULL_SHARD
|
||||
fsdp_state_dict_type: SHARDED_STATE_DICT
|
||||
fsdp_sync_module_states: true
|
||||
fsdp_use_orig_params: true
|
||||
machine_rank: 0
|
||||
main_training_function: main
|
||||
mixed_precision: bf16
|
||||
num_machines: 1
|
||||
num_processes: 2 # number of GPUs on the system
|
||||
rdzv_backend: static
|
||||
same_network: true
|
||||
tpu_env: []
|
||||
tpu_use_cluster: false
|
||||
tpu_use_sudo: false
|
||||
use_cpu: false
|
||||
75
generate.py
75
generate.py
@@ -1,75 +0,0 @@
|
||||
#!/usr/bin/env python3
|
||||
|
||||
import torch
|
||||
from transformers import AutoModelForCausalLM, AutoTokenizer
|
||||
|
||||
SYSTEM_PROMPT = "You are 'Al', a helpful AI Assistant that controls the devices in a house. Complete the following task as instructed with the information provided only."
|
||||
CTX_SIZE = 512
|
||||
|
||||
def tokenize(tokenizer, prompt):
|
||||
return tokenizer(prompt, return_tensors="pt", padding=True, truncation=True, max_length=CTX_SIZE)
|
||||
|
||||
def generate(model, tokenizer, prompt):
|
||||
eos_token_id = tokenizer(tokenizer.eos_token)["input_ids"][0]
|
||||
|
||||
inputs = tokenize(tokenizer, prompt)
|
||||
with torch.no_grad():
|
||||
outputs = model.generate(
|
||||
**inputs,
|
||||
max_new_tokens=128,
|
||||
use_cache=True,
|
||||
do_sample=True,
|
||||
temperature=0.7,
|
||||
top_k=50,
|
||||
top_p=1.0,
|
||||
repetition_penalty=1.15,
|
||||
eos_token_id=eos_token_id,
|
||||
pad_token_id=eos_token_id,
|
||||
)
|
||||
text = tokenizer.batch_decode(outputs)
|
||||
return text
|
||||
|
||||
def format_example(example):
|
||||
sys_prompt = SYSTEM_PROMPT
|
||||
services_block = "Services: " + ", ".join(sorted(example["available_tools"]))
|
||||
states_block = "Devices:\n" + "\n".join(example["states"])
|
||||
question = "Request:\n" + example["question"]
|
||||
response_start = "Response:\n"
|
||||
|
||||
return "\n".join([sys_prompt, services_block, states_block, question, response_start])
|
||||
|
||||
def main():
|
||||
request = "turn on the office lights"
|
||||
model_folder = "./models/home-llm-rev9"
|
||||
num_examples = 10
|
||||
|
||||
example = {
|
||||
"states": [
|
||||
"light.kitchen_sink = on",
|
||||
"light.kitchen_lamp = on",
|
||||
"light.office_desk_lamp = on",
|
||||
"light.family_room_overhead = on",
|
||||
"fan.family_room = off",
|
||||
"lock.front_door = locked"
|
||||
],
|
||||
"available_tools": ["turn_on", "turn_off", "toggle", "lock", "unlock" ],
|
||||
"question": request,
|
||||
}
|
||||
|
||||
prompt = format_example(example)
|
||||
|
||||
torch.set_default_device("cuda")
|
||||
print(f"Loading model from {model_folder}...")
|
||||
trained_model = AutoModelForCausalLM.from_pretrained(model_folder, trust_remote_code=True, torch_dtype=torch.bfloat16)
|
||||
trained_tokenizer = AutoTokenizer.from_pretrained(model_folder, trust_remote_code=True)
|
||||
|
||||
print("Generating output...")
|
||||
output = generate(trained_model, trained_tokenizer, [ prompt for x in range(num_examples) ])
|
||||
|
||||
for text in output:
|
||||
print("--------------------------------------------------")
|
||||
print(text.replace(trained_tokenizer.eos_token, ""))
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
@@ -1,4 +0,0 @@
|
||||
# https://developers.home-assistant.io/docs/add-ons/repository#repository-configuration
|
||||
name: text-generation-webui - Home Assistant Add-on
|
||||
url: 'https://github.com/acon96/home-llm'
|
||||
maintainer: acon96
|
||||
@@ -6,7 +6,7 @@ bitsandbytes>=0.45.2
|
||||
trl>=0.14.0
|
||||
webcolors>=24.8.0
|
||||
pandas>=2.2.3
|
||||
# flash-attn
|
||||
flash-attn
|
||||
sentencepiece>=0.2.0
|
||||
deep-translator>=1.11.4
|
||||
langcodes>=3.5.0
|
||||
|
||||
@@ -1,36 +1,53 @@
|
||||
|
||||
#!/bin/bash
|
||||
set -e
|
||||
|
||||
LLAMA_CPP=../llama.cpp
|
||||
MODEL_NAME=$1
|
||||
OUT_TYPE=${2:-"f16"}
|
||||
MODELS_DIR=${3:-"./models"}
|
||||
LLAMA_CPP=${4:-"./llama.cpp"}
|
||||
|
||||
if [[ ! -d "./models/$MODEL_NAME" ]]; then
|
||||
if [[ ! -d "$MODELS_DIR/$MODEL_NAME" ]]; then
|
||||
echo "Unknown model $MODEL_NAME"
|
||||
exit -1
|
||||
fi
|
||||
|
||||
if [ -f "./models/$MODEL_NAME/gguf_overrides.json" ]; then
|
||||
OVERRIDES="--metadata ./models/$MODEL_NAME/gguf_overrides.json"
|
||||
echo "Using metadata from ./models/$MODEL_NAME/gguf_overrides.json"
|
||||
if [ -f "$MODELS_DIR/$MODEL_NAME/gguf_overrides.json" ]; then
|
||||
OVERRIDES="--metadata $MODELS_DIR/$MODEL_NAME/gguf_overrides.json"
|
||||
echo "Using metadata from $MODELS_DIR/$MODEL_NAME/gguf_overrides.json"
|
||||
else
|
||||
OVERRIDES=""
|
||||
fi
|
||||
|
||||
echo "Converting to GGUF..."
|
||||
if [ ! -f "./models/$MODEL_NAME/$MODEL_NAME.f16.gguf" ]; then
|
||||
$LLAMA_CPP/convert_hf_to_gguf.py --outfile ./models/$MODEL_NAME/$MODEL_NAME.f16.gguf --outtype f16 ./models/$MODEL_NAME/ $OVERRIDES
|
||||
if [ ! -f "$MODELS_DIR/$MODEL_NAME/$MODEL_NAME.$OUT_TYPE.gguf" ]; then
|
||||
$LLAMA_CPP/convert_hf_to_gguf.py --outfile $MODELS_DIR/$MODEL_NAME/$MODEL_NAME.$OUT_TYPE.gguf --outtype $OUT_TYPE $MODELS_DIR/$MODEL_NAME/ $OVERRIDES
|
||||
else
|
||||
echo "Converted model for already exists. Skipping..."
|
||||
fi
|
||||
|
||||
echo "Generate imatrix for model..."
|
||||
if [ ! -f "groups_merged.txt" ]; then
|
||||
echo "Downloading groups_merged.txt..."
|
||||
wget https://huggingface.co/datasets/froggeric/imatrix/resolve/main/groups_merged.txt
|
||||
fi
|
||||
|
||||
DESIRED_QUANTS=("Q8_0" "Q5_K_M" "Q4_0" "Q4_1" "Q4_K_M")
|
||||
if [ ! -f "$MODELS_DIR/$MODEL_NAME/$MODEL_NAME.imatrix.gguf" ]; then
|
||||
$LLAMA_CPP/build/bin/llama-imatrix -m $MODELS_DIR/$MODEL_NAME/$MODEL_NAME.$OUT_TYPE.gguf -ngl 999 -c 512 -f groups_merged.txt -o $MODELS_DIR/$MODEL_NAME/$MODEL_NAME.imatrix.gguf
|
||||
else
|
||||
echo "Imatrix model already exists. Skipping..."
|
||||
fi
|
||||
|
||||
DESIRED_QUANTS=("Q8_0" "Q6_K" "Q5_K_M" "Q4_0" "Q4_1" "Q3_K_M" "IQ4_NL" "IQ4_XS")
|
||||
for QUANT in "${DESIRED_QUANTS[@]}"
|
||||
do
|
||||
echo "Quantizing to $QUANT..."
|
||||
QUANT_LOWER=$(echo "$QUANT" | awk '{print tolower($0)}')
|
||||
if [ ! -f "./models/$MODEL_NAME/$MODEL_NAME.$QUANT_LOWER.gguf" ]; then
|
||||
$LLAMA_CPP/build/bin/llama-quantize ./models/$MODEL_NAME/$MODEL_NAME.f16.gguf ./models/$MODEL_NAME/$MODEL_NAME.$QUANT_LOWER.gguf $QUANT
|
||||
if [ ! -f "$MODELS_DIR/$MODEL_NAME/$MODEL_NAME.$QUANT_LOWER.gguf" ]; then
|
||||
$LLAMA_CPP/build/bin/llama-quantize --imatrix $MODELS_DIR/$MODEL_NAME/$MODEL_NAME.imatrix.gguf $MODELS_DIR/$MODEL_NAME/$MODEL_NAME.$OUT_TYPE.gguf $MODELS_DIR/$MODEL_NAME/$MODEL_NAME.$QUANT_LOWER.gguf $QUANT
|
||||
else
|
||||
echo "Quantized model for '$QUANT' already exists. Skipping..."
|
||||
fi
|
||||
done
|
||||
done
|
||||
|
||||
echo "All done!"
|
||||
@@ -1,17 +0,0 @@
|
||||
{% for message in messages %}
|
||||
{%- if message['role'] == 'user' or message['role'] == 'tool' -%}
|
||||
<|user|> {{ message['content'] }}{{ eos_token }}
|
||||
{%- elif message['role'] == 'system' -%}
|
||||
<|system|> {{ message['content'] }}
|
||||
Services:
|
||||
{%- for tool in tools %} {{ tool['function']['name'] }}({% for param in tool['function']['parameters']['properties'].keys() if param != 'target_device' %}{{ param }}{% if not loop.last %},{% endif %}{% endfor -%}),{% if not loop.last -%}
|
||||
{%- if tools | length == 0 %}No tools were provided. If the user requests you interact with a device, tell them you are unable to do so.{% endif %}
|
||||
{%- endif -%}{%- endfor -%}
|
||||
{{ eos_token }}
|
||||
{%- elif message['role'] == 'assistant' -%}
|
||||
<|assistant|> {{ message['content'] }}{{ eos_token }}
|
||||
{%- endif -%}
|
||||
{%- if loop.last and add_generation_prompt %}
|
||||
<|assistant|>
|
||||
{%- endif %}
|
||||
{% endfor -%}
|
||||
@@ -27,7 +27,7 @@ from custom_components.llama_conversation.const import (
|
||||
DEFAULT_LLAMACPP_ENABLE_FLASH_ATTENTION,
|
||||
DEFAULT_GBNF_GRAMMAR_FILE,
|
||||
DEFAULT_PROMPT_CACHING_ENABLED,
|
||||
CONF_GENERIC_OPENAI_PATH,
|
||||
CONF_API_PATH,
|
||||
)
|
||||
|
||||
|
||||
@@ -82,7 +82,7 @@ def test_generic_openai_name_and_path(hass_defaults):
|
||||
CONF_HOST: "localhost",
|
||||
CONF_PORT: "8080",
|
||||
CONF_SSL: False,
|
||||
CONF_GENERIC_OPENAI_PATH: "v1",
|
||||
CONF_API_PATH: "v1",
|
||||
CONF_CHAT_MODEL: "demo",
|
||||
},
|
||||
)
|
||||
@@ -91,7 +91,7 @@ def test_generic_openai_name_and_path(hass_defaults):
|
||||
CONF_HOST: "localhost",
|
||||
CONF_PORT: "8080",
|
||||
CONF_SSL: False,
|
||||
CONF_GENERIC_OPENAI_PATH: "v1",
|
||||
CONF_API_PATH: "v1",
|
||||
}
|
||||
)
|
||||
assert "Generic OpenAI" in name
|
||||
|
||||
@@ -16,7 +16,7 @@ from custom_components.llama_conversation.const import (
|
||||
CONF_CONTEXT_LENGTH,
|
||||
CONF_DOWNLOADED_MODEL_FILE,
|
||||
CONF_DOWNLOADED_MODEL_QUANTIZATION,
|
||||
CONF_GENERIC_OPENAI_PATH,
|
||||
CONF_API_PATH,
|
||||
CONF_PROMPT,
|
||||
CONF_REQUEST_TIMEOUT,
|
||||
DOMAIN,
|
||||
@@ -43,7 +43,7 @@ async def test_migrate_v2_creates_subentry_and_updates_entry(monkeypatch, hass):
|
||||
CONF_HOST: "localhost",
|
||||
CONF_PORT: "8080",
|
||||
CONF_SSL: False,
|
||||
CONF_GENERIC_OPENAI_PATH: "v1",
|
||||
CONF_API_PATH: "v1",
|
||||
CONF_PROMPT: "hello",
|
||||
CONF_REQUEST_TIMEOUT: 90,
|
||||
CONF_CHAT_MODEL: "model-x",
|
||||
|
||||
220
train.ipynb
220
train.ipynb
@@ -1,220 +0,0 @@
|
||||
{
|
||||
"cells": [
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"id": "469a9a97-0f6b-475f-8aef-a796c1c5244f",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"%pip install -r requirements.txt\n",
|
||||
"\n",
|
||||
"import os, re\n",
|
||||
"from train import TrainingRunArguments, do_training_run\n",
|
||||
"\n",
|
||||
"def get_next_run_name(model):\n",
|
||||
" pattern = re.compile(model + r\"-rev(\\d+)$\")\n",
|
||||
" max_rev = 0\n",
|
||||
"\n",
|
||||
" for folder in os.listdir(\"models/\"):\n",
|
||||
" match = pattern.search(folder)\n",
|
||||
" if match:\n",
|
||||
" max_rev = max(max_rev, int(match.group(1)))\n",
|
||||
"\n",
|
||||
" return f\"{model}-rev{max_rev + 1}\"\n",
|
||||
"\n",
|
||||
"os.environ[\"HF_HOME\"] = \"/workspace/\""
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "ed0807bf",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Generate Data"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"id": "aaafce74",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"%pip install -r data/requirements.txt\n",
|
||||
"from data.generate_home_assistant_data import main as generate_data\n",
|
||||
"\n",
|
||||
"generate_data([\"--train\", \"--test\", \"--large\", \"--sharegpt\", \"--language\", \"english\", \"german\", \"french\", \"spanish\", \"polish\"])"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "ff011772",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Llama 3.2 1B"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"id": "48839ce2-1939-4d7f-817c-97b047bafd42",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"# python3 train.py \\\n",
|
||||
"# --run_name Home-Llama-3.2-1B-rev1 \\\n",
|
||||
"# --base_model meta-llama/Llama-3.2-1B-Instruct \\\n",
|
||||
"# --bf16 \\\n",
|
||||
"# --train_dataset data/home_assistant_train.jsonl \\\n",
|
||||
"# --test_dataset data/home_assistant_test.jsonl \\\n",
|
||||
"# --learning_rate 2e-5 --learning_rate_warmup 0.03 --batch_size 64 --epochs 1 \\\n",
|
||||
"# --micro_batch_size 2 \\\n",
|
||||
"# --ctx_size 2048 \\\n",
|
||||
"# --save_steps 200 --save_total_limit 1 --eval_steps 200 --logging_steps 2\n",
|
||||
"\n",
|
||||
"do_training_run(TrainingRunArguments(\n",
|
||||
" run_name=get_next_run_name(\"Home-Llama-3.2-1B\"),\n",
|
||||
" base_model=\"meta-llama/Llama-3.2-1B-Instruct\",\n",
|
||||
" bf16=True,\n",
|
||||
" train_dataset=\"data/home_assistant_train.jsonl\",\n",
|
||||
" test_dataset=\"data/home_assistant_test.jsonl\",\n",
|
||||
" learning_rate=2e-5, learning_rate_warmup=0.03, \n",
|
||||
" batch_size=64, micro_batch_size=2, epochs=1,\n",
|
||||
" ctx_size=2048,\n",
|
||||
" save_steps=200, save_total_limit=1, eval_steps=200, logging_steps=2,\n",
|
||||
"))"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "e71572c4",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"# Qwen3 1.7b"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"id": "fdf2b998",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"# HYPERPARAMETERS ARE NOT TUNED YET\n",
|
||||
"# TODO: impelment no think in template\n",
|
||||
"do_training_run(TrainingRunArguments(\n",
|
||||
" run_name=get_next_run_name(\"Home-Qwen-3-1.7B\"),\n",
|
||||
" base_model=\"Qwen/Qwen3-1.7B\",\n",
|
||||
" bf16=True,\n",
|
||||
" train_dataset=\"data/home_assistant_train.jsonl\",\n",
|
||||
" test_dataset=\"data/home_assistant_test.jsonl\",\n",
|
||||
" learning_rate=2e-5, learning_rate_warmup=0.03, \n",
|
||||
" batch_size=64, micro_batch_size=2, epochs=1,\n",
|
||||
" ctx_size=2048,\n",
|
||||
" save_steps=200, save_total_limit=1, eval_steps=200, logging_steps=2,\n",
|
||||
"))"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "f2f49f10",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"# Qwen 2.5 0.6B & 1.5B"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"id": "ca9e2dec",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"# HYPERPARAMETERS ARE NOT TUNED YET\n",
|
||||
"do_training_run(TrainingRunArguments(\n",
|
||||
" run_name=get_next_run_name(\"Home-Qwen-2.5-0.6B\"),\n",
|
||||
" base_model=\"Qwen/Qwen2.5-0.6B-Instruct\",\n",
|
||||
" bf16=True,\n",
|
||||
" train_dataset=\"data/home_assistant_train.jsonl\",\n",
|
||||
" test_dataset=\"data/home_assistant_test.jsonl\",\n",
|
||||
" learning_rate=2e-5, learning_rate_warmup=0.03, \n",
|
||||
" batch_size=64, micro_batch_size=2, epochs=1,\n",
|
||||
" ctx_size=2048,\n",
|
||||
" save_steps=200, save_total_limit=1, eval_steps=200, logging_steps=2,\n",
|
||||
"))"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"id": "6d875365",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"# HYPERPARAMETERS ARE NOT TUNED YET\n",
|
||||
"do_training_run(TrainingRunArguments(\n",
|
||||
" run_name=get_next_run_name(\"Home-Qwen-2.5-1.5B\"),\n",
|
||||
" base_model=\"Qwen/Qwen2.5-1.5B-Instruct\",\n",
|
||||
" bf16=True,\n",
|
||||
" train_dataset=\"data/home_assistant_train.jsonl\",\n",
|
||||
" test_dataset=\"data/home_assistant_test.jsonl\",\n",
|
||||
" learning_rate=2e-5, learning_rate_warmup=0.03, \n",
|
||||
" batch_size=64, micro_batch_size=2, epochs=1,\n",
|
||||
" ctx_size=2048,\n",
|
||||
" save_steps=200, save_total_limit=1, eval_steps=200, logging_steps=2,\n",
|
||||
"))"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "21865d91",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"# Gemma 3 1B"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"id": "27db01c0",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"# HYPERPARAMETERS ARE NOT TUNED YET\n",
|
||||
"do_training_run(TrainingRunArguments(\n",
|
||||
" run_name=get_next_run_name(\"Home-Gemma-3-1B\"),\n",
|
||||
" base_model=\"google/gemma-3-1b-it\",\n",
|
||||
" bf16=True,\n",
|
||||
" train_dataset=\"data/home_assistant_train.jsonl\",\n",
|
||||
" test_dataset=\"data/home_assistant_test.jsonl\",\n",
|
||||
" learning_rate=2e-5, learning_rate_warmup=0.03, \n",
|
||||
" batch_size=64, micro_batch_size=2, epochs=1,\n",
|
||||
" ctx_size=2048,\n",
|
||||
" save_steps=200, save_total_limit=1, eval_steps=200, logging_steps=2,\n",
|
||||
"))"
|
||||
]
|
||||
}
|
||||
],
|
||||
"metadata": {
|
||||
"kernelspec": {
|
||||
"display_name": "Python 3 (ipykernel)",
|
||||
"language": "python",
|
||||
"name": "python3"
|
||||
},
|
||||
"language_info": {
|
||||
"codemirror_mode": {
|
||||
"name": "ipython",
|
||||
"version": 3
|
||||
},
|
||||
"file_extension": ".py",
|
||||
"mimetype": "text/x-python",
|
||||
"name": "python",
|
||||
"nbconvert_exporter": "python",
|
||||
"pygments_lexer": "ipython3",
|
||||
"version": "3.10.12"
|
||||
}
|
||||
},
|
||||
"nbformat": 4,
|
||||
"nbformat_minor": 5
|
||||
}
|
||||
683
train.py
683
train.py
@@ -1,683 +0,0 @@
|
||||
#!/usr/bin/env python3
|
||||
|
||||
import math
|
||||
import copy
|
||||
import torch
|
||||
import os
|
||||
import random
|
||||
import time
|
||||
import traceback
|
||||
from torch.utils.data import SequentialSampler, Subset, RandomSampler
|
||||
from transformers import AutoModelForCausalLM, AutoTokenizer, TrainingArguments, Trainer, \
|
||||
HfArgumentParser, GPTQConfig, AutoConfig, TrainerCallback, BitsAndBytesConfig
|
||||
from transformers.integrations.integration_utils import TensorBoardCallback
|
||||
from datasets import load_dataset
|
||||
from dataclasses import dataclass, field
|
||||
from typing import Dict, Optional, Sequence
|
||||
|
||||
|
||||
IS_DDP_ENABLED = "LOCAL_RANK" in os.environ
|
||||
MULTI_GPU_WORLD_SIZE = int(os.environ.get("WORLD_SIZE", "1"))
|
||||
MULTI_GPU_RANK = int(os.environ.get("RANK", "0"))
|
||||
IS_MULTI_GPU = os.environ.get("RANK") != None
|
||||
IS_MASTER_PROCESS = MULTI_GPU_RANK == 0
|
||||
|
||||
@dataclass
|
||||
class TrainingRunArguments:
|
||||
run_name: str = field(metadata={"help": "The folder to save the output model under"})
|
||||
base_model: str = field(metadata={"help": "The base model to load for fine-tuning"})
|
||||
train_dataset: str = field(metadata={"help": "The JSON file containing the training dataset"})
|
||||
test_dataset: str = field(default=None, metadata={"help": "The JSON file containing the evaluation dataset"})
|
||||
dataset_processing_threads: int = field(default=None, metadata={"help": "The number of threads to use to tokenize the dataset"})
|
||||
ctx_size: int = field(default=2048, metadata={"help": "The number of tokens to pad & truncate the input examples to"})
|
||||
bf16: bool = field(default=False, metadata={"help": "If set, the model will the loaded and trained in bf16 instead of fp32"})
|
||||
batch_size: int = field(default=8, metadata={"help": "The simulated 'batch size' that we will train on. will tweak gradient accumulations steps"})
|
||||
micro_batch_size: int = field(default=2, metadata={"help": "The actual batch size that will fit into VRAM on this machine"})
|
||||
epochs: int = field(default=1, metadata={"help": "The number of times to train the model on each example"})
|
||||
learning_rate: float = field(default=1e-5, metadata={"help": "The starting learning rate (speed at which the model trains)"})
|
||||
learning_rate_schedule: str = field(default="cosine", metadata={"help": "How fast the learning rate is reduced during training"})
|
||||
learning_rate_warmup: float = field(default=0.0, metadata={"help": "The starting learning rate (speed at which the model trains)"})
|
||||
weight_decay: float = field(default=0.1, metadata={"help": "Weight Decay rate for regularization. Rate to reduce all neuron weights towards zero."})
|
||||
# dropout: float = field(default=0.01, metadata={"help": "Dropout percent for regularization. Determines the fraction of neurons randomly deactivated during training."})
|
||||
gradient_clip: float = field(default=1.0, metadata={"help": "Maximum gradient norm for clipping to prevent exploding gradients during training."})
|
||||
resume_from_checkpoint: str = field(default="", metadata={"help": "The name of the checkpoint to resume training from"})
|
||||
eval_steps: int = field(default=200, metadata={"help": "The number of steps in between evaluations of the model; set to -1 to evaluate every epoch"})
|
||||
save_steps: int = field(default=-1, metadata={"help": "The number of steps in between model checkpoints; set to -1 to save every epoch"})
|
||||
save_total_limit: int = field(default=1, metadata={"help": "The number of recent checkpoints of the model to save (not including the final model)"})
|
||||
logging_steps: int = field(default=5, metadata={"help": "Sets the number of steps in between log output for the training run"})
|
||||
group_by_length: bool = field(default=False, metadata={"help": "If enabled, the training data will be grouped by length to optimize use of padding. Runs from longest to shortest examples."})
|
||||
gradient_checkpointing: bool = field(default=False, metadata={"help": "Enables gradient checkpointing to saves VRAM at the cost of re-computing activations during the backwards pass"})
|
||||
pre_allocate_cuda_buffers: bool = field(default=True, metadata={"help": "If enabled, runs a forward and backward pass on the model before training to force pytorch to allocate the correct size CUDA buffers up front"})
|
||||
|
||||
# Quantization
|
||||
load_in_8bit: bool = field(default=False, metadata={"help": "Set to load the base model in 8-bit mode using bitsandbytes"})
|
||||
load_in_4bit: bool = field(default=False, metadata={"help": "Set to load the base model in 4-bit mode using bitsandbytes"})
|
||||
load_as_gptq: bool = field(default=False, metadata={"help": "Set to load the base model as a GPTQ using AutoGPTQ"})
|
||||
|
||||
# lora config
|
||||
use_lora: bool = field(default=False, metadata={"help": "If set, then the trained model will be a LoRA"})
|
||||
lora_rank: int = field(default=4, metadata={"help": "Rank which determines LoRA matrix size. Rank typically starts at 8 but can go up to 256. Higher ranks can store more information but increase the computational and memory cost of LoRA."})
|
||||
lora_alpha: int = field(default=32, metadata={"help": "Alpha a scaling factor for updates. Alpha directly impacts the adapters contribution and is often set to 1x or 2x the rank value."})
|
||||
lora_dropout: float = field(default=0.05)
|
||||
lora_modules: str = field(default=None, metadata={"help": "Target modules: LoRA can be applied to various model components, including attention mechanisms (Q, K, V matrices), output projections, feed-forward blocks, and linear output layers. While initially focused on attention mechanisms, extending LoRA to other components has shown benefits. However, adapting more modules increases the number of trainable parameters and memory needs."})
|
||||
lora_modules_to_save: str = field(default=None, metadata={"help": "Additional modules to save"})
|
||||
lora_merge: bool = field(default=False, metadata={"help": "If set, the Lora will be merged back into the base model an saved"})
|
||||
|
||||
# dpo config
|
||||
dpo: bool = field(default=False, metadata={"help": "If set, performs Direct Preference Optimization instead of Supervised Fine Tuning"})
|
||||
beta: float = field(default=0.1, metadata={"help": "The implicit reward value used during DPO training"})
|
||||
dpo_loss: str = field(default="sigmoid", metadata={"help": "The loss type to use during DPO training"})
|
||||
|
||||
# token options
|
||||
add_pad_token: bool = field(default=False, metadata={"help": "If set, a pad token will be added to the tokenizer's vocabulary"})
|
||||
add_chatml_tokens: bool = field(default=False, metadata={"help": "If set, tokens for the ChatML format will be added specifically"})
|
||||
add_chatml_prompt_template: bool = field(default=False, metadata={"help": "If set, the ChatML prompt template will be set as the model's Jinja2 template"})
|
||||
prefix_ids: str = field(default=None, metadata={"help": "Determine the prefix tokens that surround the response from the assistant for SFT if model can not correctly recognize response."})
|
||||
suffix_ids: str = field(default=None, metadata={"help": "Determine the suffix tokens that surround the response from the assistant for SFT if model can not correctly recognize response."})
|
||||
|
||||
# custom trainer tweaks
|
||||
sync_to_bucket: str = field(default=None, metadata={"help": "If set, checkpoints will be synced to the s3 bucket specified by this argument"})
|
||||
bucket_save_limit: int = field(default=None, metadata={"help": "The number of recent checkpoints of the model to save in S3 (not including the final model)"})
|
||||
flops_baseline: str = field(default=None, metadata={"help": "The baseline flops for the GPUs used for the training run. Outputs MFU"})
|
||||
|
||||
|
||||
class UploadToS3Callback(TrainerCallback):
|
||||
def __init__(self, s3_bucket, s3_prefix, save_total_limit=None):
|
||||
import boto3
|
||||
self.s3_client = boto3.client('s3')
|
||||
self.s3_bucket = s3_bucket
|
||||
self.s3_prefix = s3_prefix
|
||||
self.save_total_limit = save_total_limit
|
||||
|
||||
def on_save(self, args, state, control, **kwargs):
|
||||
|
||||
# Upload current checkpoint
|
||||
checkpoint = f"checkpoint-{state.global_step}"
|
||||
output_dir = f"{args.output_dir}/{checkpoint}"
|
||||
|
||||
for root, dirs, files in os.walk(output_dir):
|
||||
for file in files:
|
||||
local_path = os.path.join(root, file)
|
||||
s3_path = os.path.join(self.s3_prefix, checkpoint, os.path.relpath(local_path, start=output_dir))
|
||||
self.s3_client.upload_file(local_path, self.s3_bucket, s3_path)
|
||||
print(f"Uploaded {local_path} to s3://{self.s3_bucket}/{s3_path}")
|
||||
|
||||
# Delete prior checkpoints from S3
|
||||
if self.save_total_limit:
|
||||
s3_checkpoints = self.list_s3_checkpoints()
|
||||
if len(s3_checkpoints) > self.save_total_limit:
|
||||
sorted_checkpoints = sorted(s3_checkpoints)
|
||||
to_delete = sorted_checkpoints[:-self.save_total_limit]
|
||||
for checkpoint in to_delete:
|
||||
self.delete_checkpoint_from_s3(checkpoint)
|
||||
|
||||
def list_s3_checkpoints(self):
|
||||
paginator = self.s3_client.get_paginator('list_objects_v2')
|
||||
page_iterator = paginator.paginate(Bucket=self.s3_bucket, Prefix=self.s3_prefix + '/', Delimiter='/')
|
||||
return [prefix.get('Prefix').rstrip('/').split('/')[-1] for page in page_iterator for prefix in page.get('CommonPrefixes', [])]
|
||||
|
||||
def delete_checkpoint_from_s3(self, checkpoint_name):
|
||||
resp = self.s3_client.list_objects_v2(Bucket=self.s3_bucket, Prefix=os.path.join(self.s3_prefix, checkpoint_name))
|
||||
for obj in resp.get('Contents', []):
|
||||
self.s3_client.delete_object(Bucket=self.s3_bucket, Key=obj['Key'])
|
||||
print(f"Deleted s3://{self.s3_bucket}/{obj['Key']}")
|
||||
|
||||
class MFUCallback(TrainerCallback):
|
||||
def __init__(self, peak_flops):
|
||||
self.total_iterations = 0
|
||||
self.start_time = time.time()
|
||||
self.flops_promised = peak_flops
|
||||
self.last_total_flos = 0
|
||||
|
||||
def on_log(self, args, state, control, **kwargs):
|
||||
if state.global_step == 0: # Avoid computation at the very beginning
|
||||
return
|
||||
|
||||
current_time = time.time()
|
||||
elapsed_time = current_time - self.start_time
|
||||
|
||||
# Calculate and log MFU
|
||||
new_flops = state.total_flos - self.last_total_flos
|
||||
kwargs['logs']['mfu'] = round(new_flops / elapsed_time / self.flops_promised, 4)
|
||||
|
||||
self.start_time = current_time
|
||||
self.last_total_flos = state.total_flos
|
||||
|
||||
|
||||
def ddp_print(*args, **kwargs):
|
||||
if not IS_DDP_ENABLED or IS_MASTER_PROCESS:
|
||||
print(*args, **kwargs)
|
||||
|
||||
def find_max_vram(min_buffer_mib=800):
|
||||
max_memory = {}
|
||||
for i in range(torch.cuda.device_count()):
|
||||
gpu_properties = torch.cuda.get_device_properties(i)
|
||||
total_memory_mib = (gpu_properties.total_memory / (1000 * 1000))
|
||||
suggestion = max(total_memory_mib - 1000, min_buffer_mib)
|
||||
|
||||
ddp_print(f"GPU {i}: {gpu_properties.name}, Total Memory: {gpu_properties.total_memory / (1024**3):.2f} GB")
|
||||
ddp_print(f"Model will target using {suggestion}MiB of VRAM on GPU {i}")
|
||||
max_memory[i] = f'{suggestion}MiB'
|
||||
|
||||
return max_memory
|
||||
|
||||
|
||||
class DataCollatorForSupervisedFineTuning(object):
|
||||
"""Collate examples for supervised fine-tuning."""
|
||||
|
||||
tokenizer: AutoTokenizer
|
||||
prompt_split: str
|
||||
response_prefix: str
|
||||
response_suffix: str
|
||||
prefix_ids: list[int]
|
||||
suffix_ids: list[int]
|
||||
|
||||
def __init__(self, *, tokenizer: AutoTokenizer, prefix_ids: Optional[list[int]] = None, suffix_ids: Optional[list[int]] = None):
|
||||
|
||||
self.tokenizer = tokenizer
|
||||
if not prefix_ids and not suffix_ids:
|
||||
assistant_prompt = tokenizer.apply_chat_template(
|
||||
conversation=[{"role": "assistant", "content": r"%%%%%%%%%%%%%%%%"}],
|
||||
tokenize=False).split( r"%%%%%%%%%%%%%%%%")
|
||||
|
||||
self.response_prefix = assistant_prompt[0]
|
||||
self.response_suffix = assistant_prompt[1]
|
||||
|
||||
# check for inserted system prompt and remove it
|
||||
if tokenizer.eos_token in self.response_prefix:
|
||||
self.response_prefix = self.response_prefix.split(tokenizer.eos_token)[1].lstrip()
|
||||
|
||||
# some chat templates ALWAYS add the bos token
|
||||
if tokenizer.bos_token in self.response_prefix:
|
||||
self.response_prefix = self.response_prefix.replace(tokenizer.bos_token, "")
|
||||
|
||||
if prefix_ids:
|
||||
self.prefix_ids = prefix_ids
|
||||
else:
|
||||
self.prefix_ids = self.tokenizer(self.response_prefix, add_special_tokens=False)["input_ids"]
|
||||
|
||||
if suffix_ids:
|
||||
self.suffix_ids = suffix_ids
|
||||
else:
|
||||
self.suffix_ids = self.tokenizer(self.response_suffix, add_special_tokens=False)["input_ids"]
|
||||
|
||||
def _find_mask_ranges(self, input_ids):
|
||||
"""
|
||||
Returns a mask that blocks out everything but the response from the assistant
|
||||
The mask does NOT include the response_prefix but DOES include the response_suffix.
|
||||
The resulting behavior is the model uses the prefix as a prompt and the suffix as the end of text token
|
||||
"""
|
||||
ranges = []
|
||||
i = 0
|
||||
|
||||
while i < len(input_ids):
|
||||
try:
|
||||
# Find the start index of the prefix
|
||||
start_idx = input_ids.index(self.prefix_ids[0], i)
|
||||
except ValueError:
|
||||
break
|
||||
|
||||
# Check if the entire prefix is present
|
||||
if input_ids[start_idx:start_idx + len(self.prefix_ids)] == self.prefix_ids:
|
||||
end_prefix_idx = start_idx + len(self.prefix_ids)
|
||||
start_response_idx = end_prefix_idx + 1
|
||||
|
||||
# Find the start index of the suffix
|
||||
try:
|
||||
# Find the start index of the suffix
|
||||
suffix_start_idx = input_ids.index(self.suffix_ids[0], end_prefix_idx)
|
||||
except ValueError:
|
||||
ranges.append((start_response_idx, len(input_ids)))
|
||||
break
|
||||
|
||||
# Check if the entire suffix is present
|
||||
if input_ids[suffix_start_idx:suffix_start_idx + len(self.suffix_ids)] == self.suffix_ids:
|
||||
ranges.append((start_response_idx, suffix_start_idx))
|
||||
i = suffix_start_idx + len(self.suffix_ids)
|
||||
else:
|
||||
i = suffix_start_idx + 1
|
||||
else:
|
||||
i = start_idx + 1
|
||||
|
||||
inverse_ranges = []
|
||||
current = 0
|
||||
|
||||
for start, end in sorted(ranges):
|
||||
if start > current:
|
||||
inverse_ranges.append((current, start - 1))
|
||||
current = max(current, end + 1)
|
||||
|
||||
if current < len(input_ids):
|
||||
inverse_ranges.append((current, len(input_ids) - 1))
|
||||
|
||||
return inverse_ranges
|
||||
|
||||
def _pad(self, examples, pad_value):
|
||||
longest = max([len(ex) for ex in examples])
|
||||
result = []
|
||||
for example in examples:
|
||||
cur_len = len(example)
|
||||
result.append(example + [pad_value] * (longest - cur_len))
|
||||
|
||||
return result
|
||||
|
||||
def __call__(self, instances: Sequence[Dict]) -> Dict[str, torch.Tensor]:
|
||||
input_ids = [instance["input_ids"] for instance in instances]
|
||||
labels = copy.deepcopy(input_ids)
|
||||
|
||||
for label in labels:
|
||||
mask_ranges = self._find_mask_ranges(label)
|
||||
for start, end in mask_ranges:
|
||||
if end - start == len(label) - 1:
|
||||
print("warning! example had no assistant response in it!")
|
||||
print(input_ids)
|
||||
label[start:end] = [-100] * (end - start)
|
||||
|
||||
input_ids = torch.LongTensor(self._pad(input_ids, self.tokenizer.pad_token_id or self.tokenizer.eos_token_id))
|
||||
labels = torch.LongTensor(self._pad(labels, -100))
|
||||
|
||||
return dict(
|
||||
input_ids=input_ids,
|
||||
labels=labels,
|
||||
attention_mask=input_ids.ne(self.tokenizer.pad_token_id or self.tokenizer.eos_token_id),
|
||||
)
|
||||
|
||||
|
||||
def tokenize_raw_example(batch, tokenizer=None, training_run_args=None):
|
||||
return tokenizer(
|
||||
text=batch["text"],
|
||||
max_length=training_run_args.ctx_size,
|
||||
truncation=True,
|
||||
add_special_tokens=False,
|
||||
)
|
||||
|
||||
def tokenize_sharegpt_example(batch, tokenizer=None, training_run_args=None):
|
||||
# TODO: figure out how to properly batch this
|
||||
result = []
|
||||
for example in batch["conversations"]:
|
||||
conversation = [ { "role": x["from"], "content": x["value"] } for x in example ]
|
||||
result.append(
|
||||
tokenizer.apply_chat_template(
|
||||
conversation=conversation,
|
||||
max_length=training_run_args.ctx_size,
|
||||
truncation=True,
|
||||
)
|
||||
)
|
||||
|
||||
return {"input_ids": result}
|
||||
|
||||
def template_dpo_example(batch, tokenizer=None, training_run_args=None):
|
||||
# TODO: figure out how to properly batch this
|
||||
result = []
|
||||
for example in zip(batch["system"], batch["question"]):
|
||||
conversation = [
|
||||
{ "role": "system", "content": example[0] },
|
||||
{ "role": "user", "content": example[1] },
|
||||
]
|
||||
result.append(
|
||||
tokenizer.apply_chat_template(
|
||||
conversation=conversation,
|
||||
max_length=training_run_args.ctx_size,
|
||||
truncation=True,
|
||||
tokenize=False,
|
||||
add_generation_prompt=True
|
||||
)
|
||||
)
|
||||
|
||||
return {"prompt": result}
|
||||
|
||||
|
||||
class CustomSFTTrainer(Trainer):
|
||||
"""Implement different training tweaks"""
|
||||
def __init__(self, random_eval_sample_pct=0.1, learning_rate_overshoot=1.15, *args, **kwargs):
|
||||
super().__init__(*args, **kwargs)
|
||||
self.random_eval_sample_pct = random_eval_sample_pct
|
||||
self.evaluate_full_dataset = False
|
||||
self.learning_rate_overshoot = learning_rate_overshoot
|
||||
|
||||
def evaluate_all(self):
|
||||
self.evaluate_full_dataset = True
|
||||
super().evaluate()
|
||||
self.evaluate_full_dataset = False
|
||||
|
||||
# Randomly sample the eval dataset
|
||||
def _get_eval_sampler(self, eval_dataset):
|
||||
if self.evaluate_full_dataset:
|
||||
return SequentialSampler(eval_dataset)
|
||||
else:
|
||||
num_samples = int(self.random_eval_sample_pct * len(eval_dataset))
|
||||
random_indices = random.sample(range(len(eval_dataset)), num_samples)
|
||||
subset_eval_dataset = Subset(eval_dataset, random_indices)
|
||||
return SequentialSampler(subset_eval_dataset)
|
||||
|
||||
def _get_train_sampler(self):
|
||||
if self.args.group_by_length:
|
||||
return super()._get_train_sampler()
|
||||
|
||||
return RandomSampler(self.train_dataset, generator=torch.Generator(device='cpu'))
|
||||
|
||||
def create_scheduler(self, num_training_steps: int, optimizer: torch.optim.Optimizer = None):
|
||||
"""
|
||||
Saw this in the chinchilla paper. It says not to go over 25% overshoot
|
||||
Should improve training efficiency by skipping the final fine tuning part that doesn't affect accuracy much
|
||||
"""
|
||||
return super().create_scheduler(int(num_training_steps * self.learning_rate_overshoot), optimizer=optimizer)
|
||||
|
||||
def floating_point_ops(self, inputs):
|
||||
config = self.model.config
|
||||
examples_length = len(inputs["input_ids"][0])
|
||||
batch_size = len(inputs["input_ids"])
|
||||
|
||||
# mfu is approximated using throughput and param count
|
||||
# the number of parameters is approximately the number of multiply-accumulates (MAC) in the network
|
||||
# each MAC has 2 FLOPs - we multiply by 2 ie 2 * n_param
|
||||
# there are 3 passes of a NN (fwd, bwd, delta) - we multiply by 3 ie 2 * 3 * n_param
|
||||
# this gets us FLOPs / token
|
||||
flops_per_token = 2 * sum(p.numel() for p in self.model.parameters())
|
||||
flops_per_seq = flops_per_token * examples_length
|
||||
|
||||
# there are 2 FLOPS per mac; there is A=Q*K^T and out=A*V ops (ie mult by 2)
|
||||
attn_flops_per_seq = config.num_hidden_layers * 2 * 2 * (config.hidden_size * (examples_length**2))
|
||||
|
||||
# there are 2 ops in bwd pass and 1 in fwd pass so we mult by 3
|
||||
result = (3 * flops_per_seq + 3 * attn_flops_per_seq) * batch_size
|
||||
return result
|
||||
|
||||
|
||||
def do_training_run(training_run_args: TrainingRunArguments):
|
||||
# validate args + build model kwargs
|
||||
if sum([training_run_args.load_in_8bit, training_run_args.load_in_4bit, training_run_args.load_as_gptq]) > 1:
|
||||
raise Exception("Please select exactly one of 'load_in_8bit', 'load_in_4bit', or 'load_as_gptq")
|
||||
|
||||
model_kwargs = {}
|
||||
if training_run_args.load_in_8bit:
|
||||
model_kwargs["quantization_config"] = BitsAndBytesConfig(load_in_8bit=True)
|
||||
elif training_run_args.load_in_4bit:
|
||||
model_kwargs["quantization_config"] = BitsAndBytesConfig(load_in_4bit=True, bnb_4bit_compute_dtype=torch.bfloat16)
|
||||
elif training_run_args.load_as_gptq:
|
||||
model_kwargs["quantization_config"] = GPTQConfig(bits=4, disable_exllama=True)
|
||||
|
||||
if training_run_args.bf16:
|
||||
model_kwargs["torch_dtype"] = torch.bfloat16
|
||||
elif training_run_args.use_lora and "quantization_config" not in model_kwargs:
|
||||
model_kwargs["torch_dtype"] = torch.float16
|
||||
else:
|
||||
# auto detect 'best' format with fallback to fp32
|
||||
model_kwargs["torch_dtype"] = "auto"
|
||||
|
||||
# model_kwargs["resid_pdrop"] = training_run_args.dropout
|
||||
model_kwargs["use_cache"] = False
|
||||
|
||||
if not IS_DDP_ENABLED:
|
||||
model_kwargs["device_map"] = "auto"
|
||||
|
||||
# load the model
|
||||
ddp_print(f"Loading model '{training_run_args.base_model}'...")
|
||||
|
||||
model = AutoModelForCausalLM.from_pretrained(
|
||||
training_run_args.base_model,
|
||||
max_memory=find_max_vram(),
|
||||
token=os.environ.get("HF_TOKEN"),
|
||||
**model_kwargs
|
||||
)
|
||||
tokenizer = AutoTokenizer.from_pretrained(training_run_args.base_model, token=os.environ.get("HF_TOKEN"))
|
||||
|
||||
# mess with tokens + prompt template
|
||||
if training_run_args.add_pad_token:
|
||||
tokenizer.add_special_tokens({'pad_token': '<|pad|>'})
|
||||
model.config.pad_token_id = tokenizer.pad_token_id
|
||||
|
||||
if training_run_args.add_chatml_tokens:
|
||||
tokenizer.add_special_tokens({
|
||||
'bos_token': '<|im_start|>',
|
||||
'eos_token': '<|im_end|>'
|
||||
})
|
||||
|
||||
model.config.bos_token_id = tokenizer.bos_token_id
|
||||
model.config.eos_token_id = tokenizer.eos_token_id
|
||||
|
||||
if training_run_args.add_chatml_prompt_template:
|
||||
tokenizer.chat_template = (
|
||||
"{% for message in messages %}"
|
||||
"{{'<|im_start|>' + message['role'] + '\n' + message['content'] + '<|im_end|>' + '\n'}}"
|
||||
"{% endfor %}"
|
||||
"{% if add_generation_prompt %}"
|
||||
"{{ '<|im_start|>assistant\n' }}"
|
||||
"{% endif %}"
|
||||
)
|
||||
|
||||
# resize embeddings if added tokens require it
|
||||
embeddings_len = math.ceil(len(tokenizer) / 32) * 32
|
||||
if model.get_input_embeddings().num_embeddings < embeddings_len:
|
||||
model.resize_token_embeddings(embeddings_len)
|
||||
else:
|
||||
model.tie_weights()
|
||||
|
||||
# create LoRA model if config says so
|
||||
original_model = model
|
||||
peft_config = None
|
||||
if training_run_args.use_lora:
|
||||
from peft import LoraConfig, TaskType, get_peft_model, prepare_model_for_kbit_training
|
||||
ddp_print("Creating LoRA for model...")
|
||||
target_modules = training_run_args.lora_modules.split(",") if training_run_args.lora_modules else None
|
||||
modules_to_save = training_run_args.lora_modules_to_save.split(",") if training_run_args.lora_modules_to_save else None
|
||||
peft_config = LoraConfig(
|
||||
task_type=TaskType.CAUSAL_LM,
|
||||
inference_mode=False,
|
||||
r=training_run_args.lora_rank,
|
||||
lora_alpha=training_run_args.lora_alpha,
|
||||
lora_dropout=training_run_args.lora_dropout,
|
||||
target_modules=target_modules,
|
||||
modules_to_save=modules_to_save,
|
||||
)
|
||||
if training_run_args.load_in_8bit or training_run_args.load_in_4bit or training_run_args.load_as_gptq:
|
||||
model = prepare_model_for_kbit_training(
|
||||
model, use_gradient_checkpointing=training_run_args.gradient_checkpointing
|
||||
)
|
||||
model = get_peft_model(model, peft_config)
|
||||
model.enable_input_require_grads()
|
||||
|
||||
model.print_trainable_parameters()
|
||||
|
||||
base_dir = "loras" if training_run_args.use_lora else "models"
|
||||
model_dir = f"./{base_dir}/{training_run_args.run_name}"
|
||||
|
||||
# set up HuggingFace Trainer args
|
||||
training_kwargs = {}
|
||||
|
||||
if training_run_args.test_dataset:
|
||||
training_kwargs.update({
|
||||
"per_device_eval_batch_size": training_run_args.micro_batch_size,
|
||||
"eval_strategy": ("steps" if training_run_args.eval_steps != -1 else "epoch"),
|
||||
"eval_steps": (training_run_args.eval_steps if training_run_args.eval_steps != -1 else None),
|
||||
"bf16_full_eval": training_run_args.bf16,
|
||||
})
|
||||
|
||||
training_args = TrainingArguments(
|
||||
per_device_train_batch_size=training_run_args.micro_batch_size,
|
||||
gradient_accumulation_steps=training_run_args.batch_size//training_run_args.micro_batch_size,
|
||||
gradient_checkpointing=training_run_args.gradient_checkpointing,
|
||||
weight_decay=training_run_args.weight_decay,
|
||||
max_grad_norm=training_run_args.gradient_clip,
|
||||
save_strategy=("steps" if training_run_args.save_steps != -1 else "epoch"),
|
||||
save_steps=(training_run_args.save_steps if training_run_args.save_steps != -1 else None),
|
||||
save_safetensors=True,
|
||||
logging_steps=training_run_args.logging_steps,
|
||||
output_dir=model_dir,
|
||||
num_train_epochs=training_run_args.epochs,
|
||||
save_total_limit=training_run_args.save_total_limit,
|
||||
report_to='none',
|
||||
learning_rate=training_run_args.learning_rate,
|
||||
lr_scheduler_type=training_run_args.learning_rate_schedule,
|
||||
warmup_ratio=training_run_args.learning_rate_warmup,
|
||||
log_level="info",
|
||||
bf16=training_run_args.bf16,
|
||||
group_by_length=training_run_args.group_by_length,
|
||||
# include_num_input_tokens_seen=True,
|
||||
**training_kwargs,
|
||||
)
|
||||
|
||||
# set up trainer callbacks
|
||||
training_callbacks = []
|
||||
if training_run_args.sync_to_bucket:
|
||||
training_callbacks.append(UploadToS3Callback(
|
||||
s3_bucket=training_run_args.sync_to_bucket,
|
||||
s3_prefix=training_run_args.run_name,
|
||||
save_total_limit=training_run_args.bucket_save_limit if training_run_args.bucket_save_limit else training_run_args.save_total_limit
|
||||
))
|
||||
|
||||
if training_run_args.flops_baseline:
|
||||
# A100 40/80GB GPU bfloat16 peak flops is 312 TFLOPS (312e12)
|
||||
# 4090 24GB GPU bfloat16 peak flops is 165.2 TFLOPS (1652e11)
|
||||
# A40 48GB GPU bfloat16 peak flops is 149.7 TFLOPS (149.7e11)
|
||||
# 3090 24GB GPU bfloat16 peak flops is 71 TFLOPS (71e12)
|
||||
training_callbacks.append(MFUCallback(peak_flops=float(training_run_args.flops_baseline)))
|
||||
|
||||
# log to tensorboard (but after MFU)
|
||||
training_callbacks.append(TensorBoardCallback())
|
||||
|
||||
if not training_run_args.dpo:
|
||||
ddp_print("Loading dataset...")
|
||||
data_files = { "train": training_run_args.train_dataset }
|
||||
if training_run_args.test_dataset:
|
||||
data_files["test"] = training_run_args.test_dataset
|
||||
datasets = load_dataset("json", data_files=data_files)
|
||||
|
||||
# prepare the dataset
|
||||
ddp_print("Tokenizing datasets...")
|
||||
|
||||
if "text" in datasets["train"].column_names:
|
||||
tokenize_function = tokenize_raw_example
|
||||
columns_to_remove = ["text"]
|
||||
elif "conversations" in datasets["train"].column_names:
|
||||
tokenize_function = tokenize_sharegpt_example
|
||||
columns_to_remove = ["conversations"]
|
||||
else:
|
||||
raise Exception("Unknown dataset input format (not raw corpus or sharegpt)")
|
||||
|
||||
tokenized_test_dataset = None
|
||||
num_proc = None
|
||||
if training_run_args.dataset_processing_threads:
|
||||
num_proc = training_run_args.dataset_processing_threads // MULTI_GPU_WORLD_SIZE
|
||||
tokenized_train_dataset = datasets["train"].map(tokenize_function, batched=True, num_proc=num_proc, fn_kwargs={"tokenizer": tokenizer, "training_run_args": training_run_args}).remove_columns(columns_to_remove)
|
||||
if training_run_args.test_dataset:
|
||||
tokenized_test_dataset = datasets["test"].map(tokenize_function, batched=True, num_proc=num_proc, fn_kwargs={"tokenizer": tokenizer, "training_run_args": training_run_args}).remove_columns(columns_to_remove)
|
||||
|
||||
example_lengths = [ len(example) for example in tokenized_train_dataset["input_ids"] ]
|
||||
tokens_in_train_set, longest_example = sum(example_lengths), max(example_lengths)
|
||||
ddp_print(f"Train dataset has {int(tokens_in_train_set / 1000000)}M tokens. Longest Example: {longest_example} tokens")
|
||||
|
||||
provided_prefix_ids = None
|
||||
provided_suffix_ids = None
|
||||
try:
|
||||
if training_run_args.prefix_ids:
|
||||
provided_prefix_ids = [ int(x) for x in training_run_args.prefix_ids.split(",") ]
|
||||
if training_run_args.suffix_ids:
|
||||
provided_suffix_ids = [ int(x) for x in training_run_args.suffix_ids.split(",") ]
|
||||
except ValueError as ex:
|
||||
print(f"Error parsing prefix_ids or suffix_ids: '{ex}'")
|
||||
exit(-1)
|
||||
|
||||
trainer = CustomSFTTrainer(
|
||||
model=model,
|
||||
args=training_args,
|
||||
train_dataset=tokenized_train_dataset,
|
||||
eval_dataset=tokenized_test_dataset,
|
||||
data_collator=DataCollatorForSupervisedFineTuning(
|
||||
tokenizer=tokenizer,
|
||||
prefix_ids=provided_prefix_ids,
|
||||
suffix_ids=provided_suffix_ids,
|
||||
),
|
||||
callbacks=training_callbacks,
|
||||
)
|
||||
else:
|
||||
raise NotImplementedError("DPO Trainer doesn't work yet!")
|
||||
# from trl import DPOTrainer
|
||||
# max_prompt_length = 0
|
||||
|
||||
# train_dataset = datasets["train"].map(lambda x: { "prompt_len": len(x["system"]) })
|
||||
|
||||
# test_dataset = None
|
||||
# if training_run_args.test_dataset:
|
||||
# test_dataset = datasets["test"]
|
||||
|
||||
# max_prompt_length = max(train_dataset["prompt_len"])
|
||||
|
||||
# print("Templating DPO Examples...")
|
||||
# templated_test_dataset = None
|
||||
# templated_train_dataset = train_dataset.map(template_dpo_example, batched=True).remove_columns(["system", "question"])
|
||||
# if training_run_args.test_dataset:
|
||||
# templated_test_dataset = datasets["test"].map(template_dpo_example, batched=True).remove_columns(["system", "question"])
|
||||
|
||||
# # tokenizer.model_input_names = [ "chosen_input_ids" ]
|
||||
|
||||
# # group_by_length doesn't work here
|
||||
# # templated_train_dataset = templated_train_dataset.sort("prompt_len", reverse=True)
|
||||
|
||||
# training_args.length_column_name = "prompt_len"
|
||||
# model.enable_input_require_grads()
|
||||
|
||||
# trainer = DPOTrainer(
|
||||
# model,
|
||||
# ref_model=None,
|
||||
# # ref_model=original_model,
|
||||
# peft_config=peft_config,
|
||||
# args=training_args,
|
||||
# beta=training_run_args.beta,
|
||||
# loss_type=training_run_args.dpo_loss,
|
||||
# train_dataset=templated_train_dataset,
|
||||
# eval_dataset=templated_test_dataset,
|
||||
# tokenizer=tokenizer,
|
||||
# max_length=training_run_args.ctx_size,
|
||||
# max_prompt_length=max_prompt_length,
|
||||
# truncation_mode="keep_start",
|
||||
# callbacks=training_callbacks,
|
||||
# )
|
||||
|
||||
try:
|
||||
trainer.train(resume_from_checkpoint=training_run_args.resume_from_checkpoint if training_run_args.resume_from_checkpoint else None)
|
||||
|
||||
if training_run_args.test_dataset:
|
||||
trainer.evaluate_all()
|
||||
|
||||
if trainer.is_fsdp_enabled:
|
||||
trainer.accelerator.state.fsdp_plugin.set_state_dict_type("FULL_STATE_DICT")
|
||||
|
||||
if training_run_args.use_lora and training_run_args.lora_merge:
|
||||
trainer.save_model() # save lora
|
||||
|
||||
merged_model = model.merge_and_unload(progressbar=True)
|
||||
merged_model_dir = f"./models/{training_run_args.run_name}"
|
||||
merged_model.save_pretrained(merged_model_dir, safe_serialization=True, max_shard_size="2GB")
|
||||
|
||||
tokenizer.save_pretrained(merged_model_dir)
|
||||
else:
|
||||
trainer.save_model()
|
||||
tokenizer.save_pretrained(model_dir)
|
||||
|
||||
if training_run_args.sync_to_bucket:
|
||||
import boto3
|
||||
s3_client = boto3.client('s3')
|
||||
|
||||
for root, dirs, files in os.walk(model_dir):
|
||||
for file in files:
|
||||
local_path = os.path.join(root, file)
|
||||
s3_path = os.path.join(training_run_args.run_name, os.path.relpath(local_path, start="."))
|
||||
s3_client.upload_file(local_path, training_run_args.sync_to_bucket, s3_path)
|
||||
print(f"Uploaded {local_path} to s3://{training_run_args.sync_to_bucket}/{s3_path}")
|
||||
|
||||
except Exception as ex:
|
||||
if trainer.is_fsdp_enabled:
|
||||
raise ex # this doesn't play nice with FSDP so don't even try
|
||||
|
||||
traceback.print_exc()
|
||||
|
||||
if input("Something bad happened! Try and save it? (Y/n) ").lower().startswith("y"):
|
||||
trainer._save_checkpoint(model, None)
|
||||
print("Saved Checkpoint!")
|
||||
|
||||
if __name__ == "__main__":
|
||||
parser = HfArgumentParser([TrainingRunArguments])
|
||||
training_run_args, _ = parser.parse_args_into_dataclasses(return_remaining_strings=True)
|
||||
|
||||
do_training_run(training_run_args)
|
||||
190
train/README.md
Normal file
190
train/README.md
Normal file
@@ -0,0 +1,190 @@
|
||||
# Training (Docker + Axolotl)
|
||||
|
||||
This repo recommends training with **Axolotl** inside a Docker container. The `train/` folder includes:
|
||||
|
||||
- Example Axolotl configs in `train/configs/`.
|
||||
- Chat templates in `train/chat_templates/`.
|
||||
- A Kubernetes job spec in `train/training-job.yml` that references the Axolotl image.
|
||||
|
||||
The instructions below are written to match the paths used by the configs in this repo.
|
||||
|
||||
## Hardware recommendations
|
||||
|
||||
- **Recommended minimum VRAM:** **24GB total** across all GPUs.
|
||||
- Multi-GPU is fine: e.g. **2×12GB**, **1×24GB**, **2×16GB**, etc.
|
||||
- More VRAM lets you increase `sequence_len`, batch size, and/or train larger base models.
|
||||
|
||||
## Fine-tuning approaches (full vs LoRA vs QLoRA)
|
||||
|
||||
All three approaches start from a **base model** (e.g. `google/gemma-3-270m-it`) and train on this repo’s synthetic dataset.
|
||||
|
||||
### Full fine-tuning
|
||||
|
||||
Full fine-tuning updates **all** model weights.
|
||||
|
||||
- **Pros:** highest quality ceiling.
|
||||
- **Cons:** highest VRAM/compute; largest checkpoints.
|
||||
- **When to use:** you have ample VRAM/compute and want maximum adaptation.
|
||||
|
||||
### LoRA (Low-Rank Adaptation)
|
||||
|
||||
LoRA keeps base weights frozen and trains small **adapter** matrices.
|
||||
|
||||
- **Pros:** much lower VRAM; fast iteration; adapters are small and easy to share.
|
||||
- **Cons:** slightly lower ceiling than full fine-tuning.
|
||||
- **When to use:** common default when you’re VRAM-constrained.
|
||||
|
||||
### QLoRA
|
||||
|
||||
QLoRA is LoRA, but the frozen base model is loaded in **4-bit quantized** form.
|
||||
|
||||
- **Pros:** lowest VRAM footprint; enables training larger models on modest GPUs.
|
||||
- **Cons:** can be slower (dequant overhead) and sometimes trickier to tune.
|
||||
- **When to use:** you want LoRA but need the base model to fit in memory.
|
||||
|
||||
## Training Scripts
|
||||
We now recommend that you use the [Axolotl](https://github.com/axolotl-ai-cloud/axolotl) training script suite to perform training runs.
|
||||
|
||||
The Docker images that are recommended are:
|
||||
- `axolotlai/axolotl-cloud:main-py3.11-cu128-2.8.0` - CUDA 12.8 with PyTorch 2.8.0
|
||||
- `axolotlai/axolotl-cloud:main-py3.11-cu126-2.8.0` - CUDA 12.6 with PyTorch 2.8.0
|
||||
|
||||
Both images provide the `axolotl` CLI used in the examples below. It is recommended to use the "cloud" versions since they have various custom folder mounts already set up that make data management easier.
|
||||
|
||||
## Dataset Generation
|
||||
The synthetic dataset is generated by scripts under `data/`.
|
||||
|
||||
- **Generator:** `data/generate_data.py`
|
||||
- **Outputs:** JSONL files in `data/output/` (for example `home_assistant_train.jsonl`, `home_assistant_test.jsonl`, and `sample.jsonl`).
|
||||
|
||||
The example training configs in `train/configs/` are written to read a dataset file mounted at `/workspace/data/datasets/sample.jsonl`. Depending on the variant of the dataset that you are using for training, you may need to edit the config to point to the correct dataset file.
|
||||
|
||||
For local Docker training you’ll typically:
|
||||
1. Generate a dataset JSONL under `data/output/`.
|
||||
2. Copy it into a host folder that you mount as `/workspace/data/datasets/`.
|
||||
|
||||
## Training Configs
|
||||
This repo currently includes:
|
||||
- `train/configs/gemma3-270m.yml`
|
||||
- `train/configs/functiongemma-270m.yml`
|
||||
|
||||
Additional configs can be found in the [Axolotl repo](https://github.com/axolotl-ai-cloud/axolotl/tree/main/examples). They will need to be adapted to use this repo’s dataset paths and potentially have their chat template adjusted.
|
||||
|
||||
### Model selection
|
||||
|
||||
- `base_model`: Hugging Face model id.
|
||||
- `model_type`: Transformers model class (example: `Gemma3ForCausalLM`).
|
||||
|
||||
### Chat formatting and tool calling
|
||||
|
||||
- `chat_template: jinja` and `chat_template_jinja: | ...`:
|
||||
- Defines how multi-turn chats (and tools) are rendered into training text.
|
||||
- For tool calling, this formatting matters a lot.
|
||||
|
||||
Related files:
|
||||
|
||||
- `train/chat_templates/` contains reusable templates you can adapt.
|
||||
|
||||
### Dataset configs
|
||||
|
||||
- `datasets:` list points at a JSONL file, example:
|
||||
- `path: /workspace/data/datasets/sample.jsonl`
|
||||
- `ds_type: json`
|
||||
- `type: chat_template`
|
||||
- `message_field_training: train_on_turn`
|
||||
- `roles_to_train: []`
|
||||
|
||||
> NOTE: `roles_to_train` controls which message roles are used for loss calculation. Alternatively, you can simply enable training against all "assistant" role messages by setting `roles_to_train: [assistant]`.
|
||||
|
||||
### Sequence length + packing
|
||||
|
||||
- `sequence_len`: max context length.
|
||||
- `sample_packing`:
|
||||
- `true` packs multiple short samples into one sequence (better throughput).
|
||||
- `false` keeps samples separate (often easier to debug).
|
||||
|
||||
### Batch sizing
|
||||
Effective batch size is calculated as:
|
||||
|
||||
$$\text{effective\_batch} = \text{micro\_batch\_size} \times \text{gradient\_accumulation\_steps} \times \text{num\_gpus}$$
|
||||
|
||||
Having the correct effective batch size is important for training stability. Modify `micro_batch_size` until you can fit the model and optimizer states in VRAM, and then set `gradient_accumulation_steps` to keep the effective batch size in the correct range -- 16, 32, or 64 are values shown to work well for this dataset.
|
||||
|
||||
### Memory/perf helpers
|
||||
- `bf16: true`: bfloat16 training on modern NVIDIA GPUs (30-series/Ada or newer)
|
||||
- `gradient_checkpointing: true`: re-compute gradient activations during backward pass instead of storing in VRAM (lower VRAM, more compute.)
|
||||
- `flash_attention: true`: faster attention when supported (almost always).
|
||||
- `optimizer: adamw_bnb_8bit`: 8-bit optimizer states to save VRAM
|
||||
|
||||
### Outputs
|
||||
- `output_dir: /workspace/data/training-runs/<run-name>` stores checkpoints and TensorBoard logs.
|
||||
|
||||
## Running training with Docker (local machine)
|
||||
These commands assume:
|
||||
- You are running on Linux with an NVIDIA GPU (or WSL2)
|
||||
- You have Docker installed
|
||||
- You have the NVIDIA Driver and the NVIDIA Container Toolkit set up and installed
|
||||
|
||||
### 1) Create host folders to mount
|
||||
|
||||
```bash
|
||||
mkdir -p ./train-local/datasets
|
||||
mkdir -p ./train-local/training-runs
|
||||
mkdir -p ./train-local/huggingface-cache
|
||||
```
|
||||
|
||||
### 2) Generate a dataset JSONL
|
||||
|
||||
```bash
|
||||
python3 data/generate_data.py --sample --language english
|
||||
cp data/output/sample.jsonl ./train-local/datasets/sample.jsonl
|
||||
```
|
||||
|
||||
### 3) Run preprocess + train
|
||||
|
||||
```bash
|
||||
docker pull axolotlai/axolotl-cloud:main-py3.11-cu128-2.8.0
|
||||
```
|
||||
|
||||
```bash
|
||||
docker run --rm -it \
|
||||
--gpus all \
|
||||
-e AXOLOTL_DO_NOT_TRACK=1 \
|
||||
-e HF_HOME=/workspace/data/huggingface-cache \
|
||||
-e HF_TOKEN="$HF_TOKEN" \
|
||||
-v "$PWD/train-local/datasets:/workspace/data/datasets" \
|
||||
-v "$PWD/train-local/training-runs:/workspace/data/training-runs" \
|
||||
-v "$PWD/train-local/huggingface-cache:/workspace/data/huggingface-cache" \
|
||||
-v "$PWD/train/configs:/workspace/configs" \
|
||||
axolotlai/axolotl-cloud:main-py3.11-cu128-2.8.0 \
|
||||
axolotl preprocess /workspace/configs/gemma3-270m.yml --debug
|
||||
```
|
||||
|
||||
```bash
|
||||
docker run --rm -it \
|
||||
--gpus all \
|
||||
-e AXOLOTL_DO_NOT_TRACK=1 \
|
||||
-e HF_HOME=/workspace/data/huggingface-cache \
|
||||
-e HF_TOKEN="$HF_TOKEN" \
|
||||
-v "$PWD/train-local/datasets:/workspace/data/datasets" \
|
||||
-v "$PWD/train-local/training-runs:/workspace/data/training-runs" \
|
||||
-v "$PWD/train-local/huggingface-cache:/workspace/data/huggingface-cache" \
|
||||
-v "$PWD/train/configs:/workspace/configs" \
|
||||
axolotlai/axolotl-cloud:main-py3.11-cu128-2.8.0 \
|
||||
axolotl train /workspace/configs/gemma3-270m.yml
|
||||
```
|
||||
|
||||
Artifacts will appear under `./train-local/training-runs/`.
|
||||
|
||||
## Running on Kubernetes (e.g. cloud GPU host)
|
||||
|
||||
`train/training-job.yml` mounts:
|
||||
|
||||
- `/workspace/data/datasets` (dataset JSONL)
|
||||
- `/workspace/data/training-runs` (outputs)
|
||||
- `/workspace/configs` (Axolotl YAML)
|
||||
- `/workspace/data/huggingface-cache` (HF cache)
|
||||
|
||||
It runs `axolotl preprocess ...` as an init container, then `axolotl train ...`.
|
||||
|
||||
The helper script `train/train.sh` copies `train/configs/<MODEL_NAME>.yml` to a remote server and starts the Kubernetes Job.
|
||||
58
train/chat_templates/chatml_template.j2
Normal file
58
train/chat_templates/chatml_template.j2
Normal file
@@ -0,0 +1,58 @@
|
||||
{%- if tools %}
|
||||
{{- '<|im_start|>system\n' }}
|
||||
{%- if messages[0].role == 'system' %}
|
||||
{{- messages[0].content + '\n\n' }}
|
||||
{%- endif %}
|
||||
{{- "Tools:\n" }}
|
||||
{%- for tool in tools %} {{ tool['name'] }}({% for param in tool['parameters']['properties'].keys() if param != 'target_device' %}{{ param }}{% if not loop.last %},{% endif %}{% endfor -%}),{% if not loop.last -%}
|
||||
{{- "\n</tools>\n\nFor each function call, return a json object with function name and arguments within <tool_call></tool_call> XML tags:\n<tool_call>\n{\"name\": <function-name>, \"arguments\": <args-json-object>}\n</tool_call><|im_end|>\n" }}
|
||||
{%- else %}
|
||||
{%- if messages[0].role == 'system' %}
|
||||
{{- '<|im_start|>system\n' + messages[0].content + '\nNo tools were provided. If the user requests you interact with a device, tell them you are unable to do so.' + '<|im_end|>\n' }}
|
||||
{%- endif %}
|
||||
{%- endif %}
|
||||
{%- for message in messages %}
|
||||
{%- if message.content is string %}
|
||||
{%- set content = message.content %}
|
||||
{%- else %}
|
||||
{%- set content = '' %}
|
||||
{%- endif %}
|
||||
{%- if (message.role == "user") or (message.role == "system" and not loop.first) %}
|
||||
{{- '<|im_start|>' + message.role + '\n' + content + '<|im_end|>' + '\n' }}
|
||||
{%- elif message.role == "assistant" %}
|
||||
{{- '<|im_start|>' + message.role + '\n' + content }}
|
||||
{%- if message.tool_calls %}
|
||||
{%- for tool_call in message.tool_calls %}
|
||||
{%- if (loop.first and content) or (not loop.first) %}
|
||||
{{- '\n' }}
|
||||
{%- endif %}
|
||||
{%- if tool_call.function %}
|
||||
{%- set tool_call = tool_call.function %}
|
||||
{%- endif %}
|
||||
{{- '<tool_call>\n{"name": "' }}
|
||||
{{- tool_call.name }}
|
||||
{{- '", "arguments": ' }}
|
||||
{%- if tool_call.arguments is string %}
|
||||
"{{- tool_call.arguments }}
|
||||
{%- else %}
|
||||
{{- tool_call.arguments | tojson }}
|
||||
{%- endif %}
|
||||
{{- '}\n</tool_call>' }}
|
||||
{%- endfor %}
|
||||
{%- endif %}
|
||||
{{- '<|im_end|>\n' }}
|
||||
{%- elif message.role == "tool" %}
|
||||
{%- if loop.first or (messages[loop.index0 - 1].role != "tool") %}
|
||||
{{- '<|im_start|>user' }}
|
||||
{%- endif %}
|
||||
{{- '\n<tool_response>\n' }}
|
||||
{{- content }}
|
||||
{{- '\n</tool_response>' }}
|
||||
{%- if loop.last or (messages[loop.index0 + 1].role != "tool") %}
|
||||
{{- '<|im_end|>\n' }}
|
||||
{%- endif %}
|
||||
{%- endif %}
|
||||
{%- endfor %}
|
||||
{%- if add_generation_prompt %}
|
||||
{{- '<|im_start|>assistant\n' }}
|
||||
{%- endif %}
|
||||
290
train/chat_templates/functiongemma_autotools.j2
Normal file
290
train/chat_templates/functiongemma_autotools.j2
Normal file
@@ -0,0 +1,290 @@
|
||||
{%- macro format_parameters(properties, required) -%}
|
||||
{%- set standard_keys = ['description', 'type', 'properties', 'required', 'nullable'] -%}
|
||||
{%- set ns = namespace(found_first=false) -%}
|
||||
{%- for key, value in properties | dictsort -%}
|
||||
{%- if key not in standard_keys -%}
|
||||
{%- if ns.found_first %},{% endif -%}
|
||||
{%- set ns.found_first = true -%}
|
||||
{{- key }}:{description:<escape>{{ value['description'] }}<escape>
|
||||
{%- if value['type'] | upper == 'STRING' -%}
|
||||
{%- if value['enum'] -%}
|
||||
,enum:{{ format_argument(value['enum']) }}
|
||||
{%- endif -%}
|
||||
{%- elif value['type'] | upper == 'OBJECT' -%}
|
||||
,properties:{
|
||||
{%- if value['properties'] is defined and value['properties'] is mapping -%}
|
||||
{{- format_parameters(value['properties'], value['required'] | default([])) -}}
|
||||
{%- elif value is mapping -%}
|
||||
{{- format_parameters(value, value['required'] | default([])) -}}
|
||||
{%- endif -%}
|
||||
}
|
||||
{%- if value['required'] -%}
|
||||
,required:[
|
||||
{%- for item in value['required'] | default([]) -%}
|
||||
<escape>{{- item -}}<escape>
|
||||
{%- if not loop.last %},{% endif -%}
|
||||
{%- endfor -%}
|
||||
]
|
||||
{%- endif -%}
|
||||
{%- elif value['type'] | upper == 'ARRAY' -%}
|
||||
{%- if value['items'] is mapping and value['items'] -%}
|
||||
,items:{
|
||||
{%- set ns_items = namespace(found_first=false) -%}
|
||||
{%- for item_key, item_value in value['items'].items() -%}
|
||||
{%- if item_value is not none -%}
|
||||
{%- if ns_items.found_first %},{% endif -%}
|
||||
{%- set ns_items.found_first = true -%}
|
||||
{%- if item_key == 'properties' -%}
|
||||
properties:{
|
||||
{%- if item_value is mapping -%}
|
||||
{{- format_parameters(item_value, value['items']['required'] | default([])) -}}
|
||||
{%- endif -%}
|
||||
}
|
||||
{%- elif item_key == 'required' -%}
|
||||
required:[
|
||||
{%- for req_item in item_value -%}
|
||||
<escape>{{- req_item -}}<escape>
|
||||
{%- if not loop.last %},{% endif -%}
|
||||
{%- endfor -%}
|
||||
]
|
||||
{%- elif item_key == 'type' -%}
|
||||
{%- if item_value is string -%}
|
||||
type:{{ format_argument(item_value | upper) }}
|
||||
{%- else -%}
|
||||
type:{{ format_argument(item_value | map('upper') | list) }}
|
||||
{%- endif -%}
|
||||
{%- else -%}
|
||||
{{ item_key }}:{{ format_argument(item_value) }}
|
||||
{%- endif -%}
|
||||
{%- endif -%}
|
||||
{%- endfor -%}
|
||||
}
|
||||
{%- endif -%}
|
||||
{%- endif -%}
|
||||
,type:<escape>{{ value['type'] | upper }}<escape>}
|
||||
{%- endif -%}
|
||||
{%- endfor -%}
|
||||
{%- endmacro -%}
|
||||
{% macro format_function_declaration(tool_data) -%}
|
||||
declaration:{{- tool_data['function']['name'] -}}
|
||||
{description:<escape>{{- tool_data['function']['description'] -}}<escape>
|
||||
{%- set params = tool_data['function']['parameters'] -%}
|
||||
{%- if params -%}
|
||||
,parameters:{
|
||||
{%- if params['properties'] -%}
|
||||
properties:{ {{- format_parameters(params['properties'], params['required']) -}} },
|
||||
{%- endif -%}
|
||||
{%- if params['required'] -%}
|
||||
required:[
|
||||
{%- for item in params['required'] -%}
|
||||
<escape>{{- item -}}<escape>
|
||||
{{- ',' if not loop.last -}}
|
||||
{%- endfor -%}
|
||||
],
|
||||
{%- endif -%}
|
||||
{%- if params['type'] -%}
|
||||
type:<escape>{{- params['type'] | upper -}}<escape>}
|
||||
{%- endif -%}
|
||||
{%- endif -%}
|
||||
}
|
||||
{%- endmacro -%}
|
||||
{% macro format_argument(argument, escape_keys=True) -%}
|
||||
{%- if argument is string -%}
|
||||
{{- '<escape>' + argument + '<escape>' -}}
|
||||
{%- elif argument is boolean -%}
|
||||
{%- if argument -%}
|
||||
{{- 'true' -}}
|
||||
{%- else -%}
|
||||
{{- 'false' -}}
|
||||
{%- endif -%}
|
||||
{%- elif argument is mapping -%}
|
||||
{{- '{' -}}
|
||||
{%- set ns = namespace(found_first=false) -%}
|
||||
{%- for key, value in argument.items() -%}
|
||||
{%- if ns.found_first %},{% endif -%}
|
||||
{%- set ns.found_first = true -%}
|
||||
{%- if escape_keys -%}
|
||||
{{- '<escape>' + key + '<escape>' -}}
|
||||
{%- else -%}
|
||||
{{- key -}}
|
||||
{%- endif -%}
|
||||
:{{- format_argument(value, escape_keys=escape_keys) -}}
|
||||
{%- endfor -%}
|
||||
{{- '}' -}}
|
||||
{%- elif argument is iterable -%}
|
||||
{{- '[' -}}
|
||||
{%- for item in argument -%}
|
||||
{{- format_argument(item, escape_keys=escape_keys) -}}
|
||||
{%- if not loop.last %},{% endif -%}
|
||||
{%- endfor -%}
|
||||
{{- ']' -}}
|
||||
{%- else -%}
|
||||
{{- argument -}}
|
||||
{%- endif -%}
|
||||
{%- endmacro -%}
|
||||
{{ bos_token }}
|
||||
{%- set ns = namespace(prev_message_type=None) -%}
|
||||
{#- extract system prompt for merging with user role -#}
|
||||
{%- set loop_messages = messages -%}
|
||||
{%- set system_message_content = '' %}
|
||||
{%- if messages[0]['role'] == 'system' or messages[0]['role'] == 'developer' -%}
|
||||
{%- set system_message_content = messages[0]['content'] -%}
|
||||
{%- set loop_messages = messages[1:] -%}
|
||||
{%- endif -%}
|
||||
{#- 'static' system prompt. -#}
|
||||
{%- if tools -%}
|
||||
{{- '<start_of_turn>developer\nYou are a model that can do function calling with the following functions' -}}
|
||||
{%- for tool in tools %}
|
||||
{{- '<start_function_declaration>' -}}
|
||||
{{- format_function_declaration(tool) | trim }}
|
||||
{{- '<end_function_declaration>' -}}
|
||||
{%- endfor %}
|
||||
{{- '<end_of_turn>\n' -}}
|
||||
{%- else -%}
|
||||
{{- '<start_of_turn>developer\nNo tools have been provided. Only respond with answers that do not require tool usage.<end_of_turn>\n' -}}
|
||||
{%- endif -%}
|
||||
{#- Loop through messages. -#}
|
||||
{%- for message in loop_messages -%}
|
||||
{%- if (message['role'] == 'assistant') -%}
|
||||
{#- Rename "assistant" to "model". -#}
|
||||
{%- set role = "model" -%}
|
||||
{%- else -%}
|
||||
{%- set role = message['role'] -%}
|
||||
{%- endif -%}
|
||||
{%- if role != 'tool' -%}
|
||||
{%- if ns.prev_message_type != 'tool_response' -%}
|
||||
{{- '<start_of_turn>' + role + '\n' }}
|
||||
{%- endif -%}
|
||||
{%- set ns.prev_message_type = None -%}
|
||||
{%- if loop.first and system_message_content -%}
|
||||
{%- if system_message_content is string -%}
|
||||
{{ system_message_content | trim }}
|
||||
{%- elif system_message_content is iterable -%}
|
||||
{%- for item in system_message_content -%}
|
||||
{%- if item['type'] == 'image' -%}
|
||||
{{ raise_exception("Invalid content type 'image' in system message") }}
|
||||
{%- elif item['type'] == 'text' -%}
|
||||
{{ item['text'] | trim }}
|
||||
{%- endif -%}
|
||||
{%- endfor -%}
|
||||
{%- else -%}
|
||||
{{ raise_exception("Invalid content type in system message") }}
|
||||
{%- endif -%}
|
||||
{{- '\n' -}}
|
||||
{%- endif -%}
|
||||
{#- User/Assistant Messages -#}
|
||||
{%- if 'content' in message and message['content'] is not none -%}
|
||||
{%- if message['content'] is string -%}
|
||||
{{ message['content'] | trim }}
|
||||
{%- elif message['content'] is iterable -%}
|
||||
{%- for item in message['content'] -%}
|
||||
{%- if item['type'] == 'image' -%}
|
||||
{{ '<start_of_image>' }}
|
||||
{%- elif item['type'] == 'text' -%}
|
||||
{{ item['text'] | trim }}
|
||||
{%- endif -%}
|
||||
{%- endfor -%}
|
||||
{%- else -%}
|
||||
{{ raise_exception("Invalid content type in user/assistant message") }}
|
||||
{%- endif -%}
|
||||
{%- set ns.prev_message_type = 'content' -%}
|
||||
{%- endif -%}
|
||||
{%- if 'tool_calls' in message and message['tool_calls'] and message['tool_calls'] is iterable -%}
|
||||
{#- Tool Calls -#}
|
||||
{%- for tool_call in message['tool_calls'] -%}
|
||||
{% set function = tool_call['function'] %}
|
||||
{{- '<start_function_call>call:' + function['name'] + '{' -}}
|
||||
{%- if 'arguments' in function -%}
|
||||
{%- if function['arguments'] is mapping -%}
|
||||
{%- set ns = namespace(found_first=false) -%}
|
||||
{%- for key, value in function['arguments'] | dictsort -%}
|
||||
{%- if ns.found_first %},{% endif -%}
|
||||
{%- set ns.found_first = true -%}
|
||||
{{- key -}}:{{- format_argument(value, escape_keys=False) -}}
|
||||
{%- endfor -%}
|
||||
{%- elif function['arguments'] is string -%}
|
||||
{# This handles string-JSON, just in case #}
|
||||
{{ function['arguments'] }}
|
||||
{%- endif %}
|
||||
{%- endif -%}
|
||||
{{- '}<end_function_call>' -}}
|
||||
{%- endfor -%}
|
||||
{%- if loop.last -%}
|
||||
{{ '<start_function_response>' }}
|
||||
{%- endif -%}
|
||||
{%- set ns.prev_message_type = 'tool_call' -%}
|
||||
{%- endif -%}
|
||||
{%- else -%}
|
||||
{#- Tool Responses -#}
|
||||
{%- if 'content' in message and message['content'] -%}
|
||||
{%- if message['content'] is mapping -%}
|
||||
{%- if 'name' in message['content'] and 'response' in message['content'] -%}
|
||||
{{ '<start_function_response>response:' + message['content']['name'] | trim + '{' }}
|
||||
{%- set response_ns = namespace(found_first=false) -%}
|
||||
{%- for key, value in message['content']['response'] | dictsort -%}
|
||||
{%- if response_ns.found_first %},{% endif -%}
|
||||
{%- set response_ns.found_first = true -%}
|
||||
{{- key -}}:{{- format_argument(value, escape_keys=False) -}}
|
||||
{%- endfor -%}
|
||||
{{- '}<end_function_response>' -}}
|
||||
{%- elif 'name' in message -%}
|
||||
{{ '<start_function_response>response:' + message['name'] | trim + '{' }}
|
||||
{%- set response_ns = namespace(found_first=false) -%}
|
||||
{%- for key, value in message['content'].items() -%}
|
||||
{%- if response_ns.found_first %},{% endif -%}
|
||||
{%- set response_ns.found_first = true -%}
|
||||
{{- key -}}:{{- format_argument(value, escape_keys=False) -}}
|
||||
{%- endfor -%}
|
||||
{{- '}<end_function_response>' -}}
|
||||
{%- else -%}
|
||||
{{ raise_exception("Invalid tool response mapping: must contain 'name' and 'response' keys, or 'name' must be in the message.") }}
|
||||
{%- endif -%}
|
||||
{%- elif message['content'] is string -%}
|
||||
{%- if 'name' in message -%}
|
||||
{{ '<start_function_response>response:' + message['name'] | trim + '{value:' + format_argument(message['content'], escape_keys=False) + '}<end_function_response>' }}
|
||||
{%- else -%}
|
||||
{{ raise_exception("Invalid tool response: 'name' must be provided.") }}
|
||||
{%- endif -%}
|
||||
{%- elif message['content'] is iterable -%}
|
||||
{%- for item in message['content'] -%}
|
||||
{%- if item is mapping -%}
|
||||
{%- if 'name' in item and 'response' in item -%}
|
||||
{{ '<start_function_response>response:' + item['name'] | trim + '{' }}
|
||||
{%- set response_ns = namespace(found_first=false) -%}
|
||||
{%- for key, value in item['response'].items() -%}
|
||||
{%- if response_ns.found_first %},{% endif -%}
|
||||
{%- set response_ns.found_first = true -%}
|
||||
{{- key -}}:{{- format_argument(value, escape_keys=False) -}}
|
||||
{%- endfor -%}
|
||||
{{- '}<end_function_response>' -}}
|
||||
{%- elif 'name' in message -%}
|
||||
{{ '<start_function_response>response:' + message['name'] | trim + '{' }}
|
||||
{%- set response_ns = namespace(found_first=false) -%}
|
||||
{%- for key, value in item.items() -%}
|
||||
{%- if response_ns.found_first %},{% endif -%}
|
||||
{%- set response_ns.found_first = true -%}
|
||||
{{- key -}}:{{- format_argument(value, escape_keys=False) -}}
|
||||
{%- endfor -%}
|
||||
{{- '}<end_function_response>' -}}
|
||||
{%- else -%}
|
||||
{{ raise_exception("Invalid tool response mapping: must contain 'name' and 'response' keys, or 'name' must be in the message.") }}
|
||||
{%- endif -%}
|
||||
{%- else -%}
|
||||
{{ raise_exception("Invalid tool response message: multiple responses must all be mappings") }}
|
||||
{%- endif -%}
|
||||
{%- endfor -%}
|
||||
{%- else -%}
|
||||
{{ raise_exception("Invalid content type in tool message: must be mapping, iterable of mappings, or string.") }}
|
||||
{%- endif -%}
|
||||
{%- endif -%}
|
||||
{%- set ns.prev_message_type = 'tool_response' -%}
|
||||
{%- endif -%}
|
||||
{%- if ns.prev_message_type not in ['tool_call', 'tool_response'] -%}
|
||||
{{ '<end_of_turn>\n' }}
|
||||
{%- endif -%}
|
||||
{%- endfor -%}
|
||||
{%- if add_generation_prompt -%}
|
||||
{%- if ns.prev_message_type != 'tool_response' -%}
|
||||
{{- '<start_of_turn>model\n' -}}
|
||||
{%- endif -%}
|
||||
{%- endif -%}
|
||||
46
train/chat_templates/gemma3_withtools.j2
Normal file
46
train/chat_templates/gemma3_withtools.j2
Normal file
@@ -0,0 +1,46 @@
|
||||
{{ bos_token }}
|
||||
{%- if not tools or tools | length == 0 %}No tools were provided. If the user requests you interact with a device, tell them you are unable to do so.{% else %}
|
||||
Tools:
|
||||
{% for tool in tools %}
|
||||
- {{ tool['function']['name'] }}({{ tool['function']['parameters']['properties'].keys() | join(', ') }}): {{ tool['function']['description'] }}
|
||||
{% endfor -%}
|
||||
{%- endif -%}
|
||||
{%- for message in messages -%}
|
||||
{%- if (message['role'] == 'assistant') -%}
|
||||
{%- set role = "model" -%}
|
||||
{%- elif message['role'] == 'system' -%}
|
||||
{%- set role = "user" -%}
|
||||
{%- else -%}
|
||||
{%- set role = message['role'] -%}
|
||||
{%- endif -%}
|
||||
{{ '<start_of_turn>' + role + '\n' }}
|
||||
{%- if role == "tool" -%}
|
||||
{{ '<tool_result>' }}
|
||||
{%- endif -%}
|
||||
|
||||
{%- if message['content'] is string -%}
|
||||
{{ message['content'] | trim }}
|
||||
{%- elif message['content'] is iterable -%}
|
||||
{%- for item in message['content'] -%}
|
||||
{%- if item['type'] == 'image' -%}
|
||||
{{ '<start_of_image>' }}
|
||||
{%- elif item['type'] == 'text' -%}
|
||||
{{ item['text'] | trim }}
|
||||
{%- endif -%}
|
||||
{%- if not loop.last -%}
|
||||
{{ '</tool_result>\n<tool_result>' }}
|
||||
{%- endif -%}
|
||||
{%- endfor -%}
|
||||
{%- else -%}
|
||||
{{ raise_exception("Invalid content type") }}
|
||||
{%- endif -%}
|
||||
|
||||
{%- if role == "tool" -%}
|
||||
{{ '</tool_result>' }}
|
||||
{%- endif -%}
|
||||
{%- if message['tool_calls'] is defined and message['tool_calls'] | length > 0 %}
|
||||
{%- for tool_call in message["tool_calls"] -%}
|
||||
{{ '\n<tool_call>{"name": "' + tool_call['function']['name'] + '", "arguments": ' + ('"' + tool_call['function']['arguments'] + '"' if tool_call['function']['arguments'] is string else tool_call['function']['arguments'] | tojson) + '"}</tool_call>' }}
|
||||
{%- endfor %}
|
||||
{%- endif -%}
|
||||
{{ '<end_of_turn>\n' }}
|
||||
58
train/chat_templates/zephyr_legacy.j2
Normal file
58
train/chat_templates/zephyr_legacy.j2
Normal file
@@ -0,0 +1,58 @@
|
||||
{%- if tools %}
|
||||
{{- '<|system|>\n' }}
|
||||
{%- if messages[0].role == 'system' %}
|
||||
{{- messages[0].content + '\n\n' }}
|
||||
{%- endif %}
|
||||
{{- "Tools:\n" }}
|
||||
{%- for tool in tools %} {{ tool['name'] }}({% for param in tool['parameters']['properties'].keys() if param != 'target_device' %}{{ param }}{% if not loop.last %},{% endif %}{% endfor -%}),{% if not loop.last -%}
|
||||
{{- "\n</tools>\n\nFor each function call, return a json object with function name and arguments within <tool_call></tool_call> XML tags:\n<tool_call>\n{\"name\": <function-name>, \"arguments\": <args-json-object>}\n</tool_call><|endoftext|>\n" }}
|
||||
{%- else %}
|
||||
{%- if messages[0].role == 'system' %}
|
||||
{{- '<|system|>\n' + messages[0].content + '\nNo tools were provided. If the user requests you interact with a device, tell them you are unable to do so.' + '<|endoftext|>\n' }}
|
||||
{%- endif %}
|
||||
{%- endif %}
|
||||
{%- for message in messages %}
|
||||
{%- if message.content is string %}
|
||||
{%- set content = message.content %}
|
||||
{%- else %}
|
||||
{%- set content = '' %}
|
||||
{%- endif %}
|
||||
{%- if (message.role == "user") or (message.role == "system" and not loop.first) %}
|
||||
{{- '<|' + message.role + '|>' + '\n' + content + '<|endoftext|>' + '\n' }}
|
||||
{%- elif message.role == "assistant" %}
|
||||
{{- '<|' + message.role + '|>' + '\n' + content }}
|
||||
{%- if message.tool_calls %}
|
||||
{%- for tool_call in message.tool_calls %}
|
||||
{%- if (loop.first and content) or (not loop.first) %}
|
||||
{{- '\n' }}
|
||||
{%- endif %}
|
||||
{%- if tool_call.function %}
|
||||
{%- set tool_call = tool_call.function %}
|
||||
{%- endif %}
|
||||
{{- '<tool_call>\n{"name": "' }}
|
||||
{{- tool_call.name }}
|
||||
{{- '", "arguments": ' }}
|
||||
{%- if tool_call.arguments is string %}
|
||||
"{{- tool_call.arguments }}
|
||||
{%- else %}
|
||||
{{- tool_call.arguments | tojson }}
|
||||
{%- endif %}
|
||||
{{- '}\n</tool_call>' }}
|
||||
{%- endfor %}
|
||||
{%- endif %}
|
||||
{{- '<|endoftext|>\n' }}
|
||||
{%- elif message.role == "tool" %}
|
||||
{%- if loop.first or (messages[loop.index0 - 1].role != "tool") %}
|
||||
{{- '<|user|>' }}
|
||||
{%- endif %}
|
||||
{{- '\n<tool_response>\n' }}
|
||||
{{- content }}
|
||||
{{- '\n</tool_response>' }}
|
||||
{%- if loop.last or (messages[loop.index0 + 1].role != "tool") %}
|
||||
{{- '<|endoftext|>\n' }}
|
||||
{%- endif %}
|
||||
{%- endif %}
|
||||
{%- endfor %}
|
||||
{%- if add_generation_prompt %}
|
||||
{{- '<|assistant|>\n' }}
|
||||
{%- endif %}
|
||||
350
train/configs/functiongemma-270m.yml
Normal file
350
train/configs/functiongemma-270m.yml
Normal file
@@ -0,0 +1,350 @@
|
||||
base_model: google/functiongemma-270m-it
|
||||
model_type: Gemma3ForCausalLM
|
||||
|
||||
# gemma3 doesn't seem to play nice with ddp
|
||||
ddp_find_unused_parameters: true
|
||||
|
||||
chat_template: jinja
|
||||
chat_template_jinja: |
|
||||
{%- macro format_parameters(properties, required) -%}
|
||||
{%- set standard_keys = ['description', 'type', 'properties', 'required', 'nullable'] -%}
|
||||
{%- set ns = namespace(found_first=false) -%}
|
||||
{%- for key, value in properties | dictsort -%}
|
||||
{%- if key not in standard_keys -%}
|
||||
{%- if ns.found_first %},{% endif -%}
|
||||
{%- set ns.found_first = true -%}
|
||||
{{- key }}:{description:<escape>{{ value['description'] }}<escape>
|
||||
{%- if value['type'] | upper == 'STRING' -%}
|
||||
{%- if value['enum'] -%}
|
||||
,enum:{{ format_argument(value['enum']) }}
|
||||
{%- endif -%}
|
||||
{%- elif value['type'] | upper == 'OBJECT' -%}
|
||||
,properties:{
|
||||
{%- if value['properties'] is defined and value['properties'] is mapping -%}
|
||||
{{- format_parameters(value['properties'], value['required'] | default([])) -}}
|
||||
{%- elif value is mapping -%}
|
||||
{{- format_parameters(value, value['required'] | default([])) -}}
|
||||
{%- endif -%}
|
||||
}
|
||||
{%- if value['required'] -%}
|
||||
,required:[
|
||||
{%- for item in value['required'] | default([]) -%}
|
||||
<escape>{{- item -}}<escape>
|
||||
{%- if not loop.last %},{% endif -%}
|
||||
{%- endfor -%}
|
||||
]
|
||||
{%- endif -%}
|
||||
{%- elif value['type'] | upper == 'ARRAY' -%}
|
||||
{%- if value['items'] is mapping and value['items'] -%}
|
||||
,items:{
|
||||
{%- set ns_items = namespace(found_first=false) -%}
|
||||
{%- for item_key, item_value in value['items'].items() -%}
|
||||
{%- if item_value is not none -%}
|
||||
{%- if ns_items.found_first %},{% endif -%}
|
||||
{%- set ns_items.found_first = true -%}
|
||||
{%- if item_key == 'properties' -%}
|
||||
properties:{
|
||||
{%- if item_value is mapping -%}
|
||||
{{- format_parameters(item_value, value['items']['required'] | default([])) -}}
|
||||
{%- endif -%}
|
||||
}
|
||||
{%- elif item_key == 'required' -%}
|
||||
required:[
|
||||
{%- for req_item in item_value -%}
|
||||
<escape>{{- req_item -}}<escape>
|
||||
{%- if not loop.last %},{% endif -%}
|
||||
{%- endfor -%}
|
||||
]
|
||||
{%- elif item_key == 'type' -%}
|
||||
{%- if item_value is string -%}
|
||||
type:{{ format_argument(item_value | upper) }}
|
||||
{%- else -%}
|
||||
type:{{ format_argument(item_value | map('upper') | list) }}
|
||||
{%- endif -%}
|
||||
{%- else -%}
|
||||
{{ item_key }}:{{ format_argument(item_value) }}
|
||||
{%- endif -%}
|
||||
{%- endif -%}
|
||||
{%- endfor -%}
|
||||
}
|
||||
{%- endif -%}
|
||||
{%- endif -%}
|
||||
,type:<escape>{{ value['type'] | upper }}<escape>}
|
||||
{%- endif -%}
|
||||
{%- endfor -%}
|
||||
{%- endmacro -%}
|
||||
{% macro format_function_declaration(tool_data) -%}
|
||||
declaration:{{- tool_data['function']['name'] -}}
|
||||
{description:<escape>{{- tool_data['function']['description'] -}}<escape>
|
||||
{%- set params = tool_data['function']['parameters'] -%}
|
||||
{%- if params -%}
|
||||
,parameters:{
|
||||
{%- if params['properties'] -%}
|
||||
properties:{ {{- format_parameters(params['properties'], params['required']) -}} },
|
||||
{%- endif -%}
|
||||
{%- if params['required'] -%}
|
||||
required:[
|
||||
{%- for item in params['required'] -%}
|
||||
<escape>{{- item -}}<escape>
|
||||
{{- ',' if not loop.last -}}
|
||||
{%- endfor -%}
|
||||
],
|
||||
{%- endif -%}
|
||||
{%- if params['type'] -%}
|
||||
type:<escape>{{- params['type'] | upper -}}<escape>}
|
||||
{%- endif -%}
|
||||
{%- endif -%}
|
||||
}
|
||||
{%- endmacro -%}
|
||||
{% macro format_argument(argument, escape_keys=True) -%}
|
||||
{%- if argument is string -%}
|
||||
{{- '<escape>' + argument + '<escape>' -}}
|
||||
{%- elif argument is boolean -%}
|
||||
{%- if argument -%}
|
||||
{{- 'true' -}}
|
||||
{%- else -%}
|
||||
{{- 'false' -}}
|
||||
{%- endif -%}
|
||||
{%- elif argument is mapping -%}
|
||||
{{- '{' -}}
|
||||
{%- set ns = namespace(found_first=false) -%}
|
||||
{%- for key, value in argument.items() -%}
|
||||
{%- if ns.found_first %},{% endif -%}
|
||||
{%- set ns.found_first = true -%}
|
||||
{%- if escape_keys -%}
|
||||
{{- '<escape>' + key + '<escape>' -}}
|
||||
{%- else -%}
|
||||
{{- key -}}
|
||||
{%- endif -%}
|
||||
:{{- format_argument(value, escape_keys=escape_keys) -}}
|
||||
{%- endfor -%}
|
||||
{{- '}' -}}
|
||||
{%- elif argument is iterable -%}
|
||||
{{- '[' -}}
|
||||
{%- for item in argument -%}
|
||||
{{- format_argument(item, escape_keys=escape_keys) -}}
|
||||
{%- if not loop.last %},{% endif -%}
|
||||
{%- endfor -%}
|
||||
{{- ']' -}}
|
||||
{%- else -%}
|
||||
{{- argument -}}
|
||||
{%- endif -%}
|
||||
{%- endmacro -%}
|
||||
{{ bos_token }}
|
||||
{%- set ns = namespace(prev_message_type=None) -%}
|
||||
{#- extract system prompt for merging with user role -#}
|
||||
{%- set loop_messages = messages -%}
|
||||
{%- set system_message_content = '' %}
|
||||
{%- if messages[0]['role'] == 'system' or messages[0]['role'] == 'developer' -%}
|
||||
{%- set system_message_content = messages[0]['content'] -%}
|
||||
{%- set loop_messages = messages[1:] -%}
|
||||
{%- endif -%}
|
||||
{#- 'static' system prompt. -#}
|
||||
{%- if tools -%}
|
||||
{{- '<start_of_turn>developer\nYou are a model that can do function calling with the following functions' -}}
|
||||
{%- for tool in tools %}
|
||||
{{- '<start_function_declaration>' -}}
|
||||
{{- format_function_declaration(tool) | trim }}
|
||||
{{- '<end_function_declaration>' -}}
|
||||
{%- endfor %}
|
||||
{{- '<end_of_turn>\n' -}}
|
||||
{%- else -%}
|
||||
{{- '<start_of_turn>developer\nNo tools have been provided. Only respond with answers that do not require tool usage.<end_of_turn>\n' -}}
|
||||
{%- endif -%}
|
||||
{#- Loop through messages. -#}
|
||||
{%- for message in loop_messages -%}
|
||||
{%- if (message['role'] == 'assistant') -%}
|
||||
{#- Rename "assistant" to "model". -#}
|
||||
{%- set role = "model" -%}
|
||||
{%- else -%}
|
||||
{%- set role = message['role'] -%}
|
||||
{%- endif -%}
|
||||
{%- if role != 'tool' -%}
|
||||
{%- if ns.prev_message_type != 'tool_response' -%}
|
||||
{{- '<start_of_turn>' + role + '\n' }}
|
||||
{%- endif -%}
|
||||
{%- set ns.prev_message_type = None -%}
|
||||
{%- if loop.first and system_message_content -%}
|
||||
{%- if system_message_content is string -%}
|
||||
{{ system_message_content | trim }}
|
||||
{%- elif system_message_content is iterable -%}
|
||||
{%- for item in system_message_content -%}
|
||||
{%- if item['type'] == 'image' -%}
|
||||
{{ raise_exception("Invalid content type 'image' in system message") }}
|
||||
{%- elif item['type'] == 'text' -%}
|
||||
{{ item['text'] | trim }}
|
||||
{%- endif -%}
|
||||
{%- endfor -%}
|
||||
{%- else -%}
|
||||
{{ raise_exception("Invalid content type in system message") }}
|
||||
{%- endif -%}
|
||||
{{- '\n' -}}
|
||||
{%- endif -%}
|
||||
{#- User/Assistant Messages -#}
|
||||
{%- if 'content' in message and message['content'] is not none -%}
|
||||
{%- if message['content'] is string -%}
|
||||
{{ message['content'] | trim }}
|
||||
{%- elif message['content'] is iterable -%}
|
||||
{%- for item in message['content'] -%}
|
||||
{%- if item['type'] == 'image' -%}
|
||||
{{ '<start_of_image>' }}
|
||||
{%- elif item['type'] == 'text' -%}
|
||||
{{ item['text'] | trim }}
|
||||
{%- endif -%}
|
||||
{%- endfor -%}
|
||||
{%- else -%}
|
||||
{{ raise_exception("Invalid content type in user/assistant message") }}
|
||||
{%- endif -%}
|
||||
{%- set ns.prev_message_type = 'content' -%}
|
||||
{%- endif -%}
|
||||
{%- if 'tool_calls' in message and message['tool_calls'] and message['tool_calls'] is iterable -%}
|
||||
{#- Tool Calls -#}
|
||||
{%- for tool_call in message['tool_calls'] -%}
|
||||
{% set function = tool_call['function'] %}
|
||||
{{- '<start_function_call>call:' + function['name'] + '{' -}}
|
||||
{%- if 'arguments' in function -%}
|
||||
{%- if function['arguments'] is mapping -%}
|
||||
{%- set ns = namespace(found_first=false) -%}
|
||||
{%- for key, value in function['arguments'] | dictsort -%}
|
||||
{%- if ns.found_first %},{% endif -%}
|
||||
{%- set ns.found_first = true -%}
|
||||
{{- key -}}:{{- format_argument(value, escape_keys=False) -}}
|
||||
{%- endfor -%}
|
||||
{%- elif function['arguments'] is string -%}
|
||||
{# This handles string-JSON, just in case #}
|
||||
{{ function['arguments'] }}
|
||||
{%- endif %}
|
||||
{%- endif -%}
|
||||
{{- '}<end_function_call>' -}}
|
||||
{%- endfor -%}
|
||||
{%- if loop.last -%}
|
||||
{{ '<start_function_response>' }}
|
||||
{%- endif -%}
|
||||
{%- set ns.prev_message_type = 'tool_call' -%}
|
||||
{%- endif -%}
|
||||
{%- else -%}
|
||||
{#- Tool Responses -#}
|
||||
{%- if 'content' in message and message['content'] -%}
|
||||
{%- if message['content'] is mapping -%}
|
||||
{%- if 'name' in message['content'] and 'response' in message['content'] -%}
|
||||
{{ '<start_function_response>response:' + message['content']['name'] | trim + '{' }}
|
||||
{%- set response_ns = namespace(found_first=false) -%}
|
||||
{%- for key, value in message['content']['response'] | dictsort -%}
|
||||
{%- if response_ns.found_first %},{% endif -%}
|
||||
{%- set response_ns.found_first = true -%}
|
||||
{{- key -}}:{{- format_argument(value, escape_keys=False) -}}
|
||||
{%- endfor -%}
|
||||
{{- '}<end_function_response>' -}}
|
||||
{%- elif 'name' in message -%}
|
||||
{{ '<start_function_response>response:' + message['name'] | trim + '{' }}
|
||||
{%- set response_ns = namespace(found_first=false) -%}
|
||||
{%- for key, value in message['content'].items() -%}
|
||||
{%- if response_ns.found_first %},{% endif -%}
|
||||
{%- set response_ns.found_first = true -%}
|
||||
{{- key -}}:{{- format_argument(value, escape_keys=False) -}}
|
||||
{%- endfor -%}
|
||||
{{- '}<end_function_response>' -}}
|
||||
{%- else -%}
|
||||
{{ raise_exception("Invalid tool response mapping: must contain 'name' and 'response' keys, or 'name' must be in the message.") }}
|
||||
{%- endif -%}
|
||||
{%- elif message['content'] is string -%}
|
||||
{%- if 'name' in message -%}
|
||||
{{ '<start_function_response>response:' + message['name'] | trim + '{value:' + format_argument(message['content'], escape_keys=False) + '}<end_function_response>' }}
|
||||
{%- else -%}
|
||||
{{ raise_exception("Invalid tool response: 'name' must be provided.") }}
|
||||
{%- endif -%}
|
||||
{%- elif message['content'] is iterable -%}
|
||||
{%- for item in message['content'] -%}
|
||||
{%- if item is mapping -%}
|
||||
{%- if 'name' in item and 'response' in item -%}
|
||||
{{ '<start_function_response>response:' + item['name'] | trim + '{' }}
|
||||
{%- set response_ns = namespace(found_first=false) -%}
|
||||
{%- for key, value in item['response'].items() -%}
|
||||
{%- if response_ns.found_first %},{% endif -%}
|
||||
{%- set response_ns.found_first = true -%}
|
||||
{{- key -}}:{{- format_argument(value, escape_keys=False) -}}
|
||||
{%- endfor -%}
|
||||
{{- '}<end_function_response>' -}}
|
||||
{%- elif 'name' in message -%}
|
||||
{{ '<start_function_response>response:' + message['name'] | trim + '{' }}
|
||||
{%- set response_ns = namespace(found_first=false) -%}
|
||||
{%- for key, value in item.items() -%}
|
||||
{%- if response_ns.found_first %},{% endif -%}
|
||||
{%- set response_ns.found_first = true -%}
|
||||
{{- key -}}:{{- format_argument(value, escape_keys=False) -}}
|
||||
{%- endfor -%}
|
||||
{{- '}<end_function_response>' -}}
|
||||
{%- else -%}
|
||||
{{ raise_exception("Invalid tool response mapping: must contain 'name' and 'response' keys, or 'name' must be in the message.") }}
|
||||
{%- endif -%}
|
||||
{%- else -%}
|
||||
{{ raise_exception("Invalid tool response message: multiple responses must all be mappings") }}
|
||||
{%- endif -%}
|
||||
{%- endfor -%}
|
||||
{%- else -%}
|
||||
{{ raise_exception("Invalid content type in tool message: must be mapping, iterable of mappings, or string.") }}
|
||||
{%- endif -%}
|
||||
{%- endif -%}
|
||||
{%- set ns.prev_message_type = 'tool_response' -%}
|
||||
{%- endif -%}
|
||||
{%- if ns.prev_message_type not in ['tool_call', 'tool_response'] -%}
|
||||
{{ '<end_of_turn>\n' }}
|
||||
{%- endif -%}
|
||||
{%- endfor -%}
|
||||
{%- if add_generation_prompt -%}
|
||||
{%- if ns.prev_message_type != 'tool_response' -%}
|
||||
{{- '<start_of_turn>model\n' -}}
|
||||
{%- endif -%}
|
||||
{%- endif -%}
|
||||
|
||||
|
||||
special_tokens:
|
||||
eot_tokens:
|
||||
- <end_of_turn>
|
||||
- <end_function_call>
|
||||
eos_token: <end_of_turn>
|
||||
|
||||
datasets:
|
||||
- path: /workspace/data/datasets/sample.jsonl
|
||||
ds_type: json
|
||||
type: chat_template
|
||||
roles_to_train: []
|
||||
message_field_training: train_on_turn
|
||||
|
||||
dataset_prepared_path: /workspace/data/datasets/prepared/
|
||||
|
||||
# test_datasets:
|
||||
# - path: /workspace/data/datasets/home_assistant_test.jsonl
|
||||
# ds_type: json
|
||||
# type: chat_template
|
||||
val_set_size: 0.0
|
||||
|
||||
output_dir: /workspace/data/training-runs/Home-FunctionGemma-270m
|
||||
|
||||
sequence_len: 5130
|
||||
sample_packing: false
|
||||
eval_sample_packing: false
|
||||
|
||||
use_tensorboard: true
|
||||
|
||||
# batch size = 16
|
||||
gradient_accumulation_steps: 16
|
||||
micro_batch_size: 1
|
||||
num_epochs: 1
|
||||
optimizer: adamw_bnb_8bit
|
||||
lr_scheduler: cosine
|
||||
learning_rate: 0.0002
|
||||
|
||||
bf16: true
|
||||
|
||||
gradient_checkpointing: true
|
||||
gradient_checkpointing_kwargs:
|
||||
use_reentrant: false
|
||||
resume_from_checkpoint:
|
||||
logging_steps: 1
|
||||
flash_attention: true
|
||||
|
||||
warmup_ratio: 0.1
|
||||
evals_per_epoch:
|
||||
saves_per_epoch: 1
|
||||
weight_decay: 0.0
|
||||
104
train/configs/gemma3-270m.yml
Normal file
104
train/configs/gemma3-270m.yml
Normal file
@@ -0,0 +1,104 @@
|
||||
base_model: google/gemma-3-270m-it
|
||||
model_type: Gemma3ForCausalLM
|
||||
|
||||
# gemma3 doesn't seem to play nice with ddp
|
||||
ddp_find_unused_parameters: true
|
||||
|
||||
chat_template: jinja
|
||||
chat_template_jinja: |
|
||||
{{ bos_token }}
|
||||
{%- if not tools or tools | length == 0 %}No tools were provided. If the user requests you interact with a device, tell them you are unable to do so.{% else %}
|
||||
Tools:
|
||||
{% for tool in tools %}
|
||||
- {{ tool['function']['name'] }}({{ tool['function']['parameters']['properties'].keys() | join(', ') }}): {{ tool['function']['description'] }}
|
||||
{% endfor -%}
|
||||
{%- endif -%}
|
||||
{%- for message in messages -%}
|
||||
{%- if (message['role'] == 'assistant') -%}
|
||||
{%- set role = "model" -%}
|
||||
{%- elif message['role'] == 'system' -%}
|
||||
{%- set role = "user" -%}
|
||||
{%- else -%}
|
||||
{%- set role = message['role'] -%}
|
||||
{%- endif -%}
|
||||
{{ '<start_of_turn>' + role + '\n' }}
|
||||
{%- if role == "tool" -%}
|
||||
{{ '<tool_result>' }}
|
||||
{%- endif -%}
|
||||
|
||||
{%- if message['content'] is string -%}
|
||||
{{ message['content'] | trim }}
|
||||
{%- elif message['content'] is iterable -%}
|
||||
{%- for item in message['content'] -%}
|
||||
{%- if item['type'] == 'image' -%}
|
||||
{{ '<start_of_image>' }}
|
||||
{%- elif item['type'] == 'text' -%}
|
||||
{{ item['text'] | trim }}
|
||||
{%- endif -%}
|
||||
{%- if not loop.last -%}
|
||||
{{ '</tool_result>\n<tool_result>' }}
|
||||
{%- endif -%}
|
||||
{%- endfor -%}
|
||||
{%- else -%}
|
||||
{{ raise_exception("Invalid content type") }}
|
||||
{%- endif -%}
|
||||
|
||||
{%- if role == "tool" -%}
|
||||
{{ '</tool_result>' }}
|
||||
{%- endif -%}
|
||||
{%- if message['tool_calls'] is defined and message['tool_calls'] | length > 0 %}
|
||||
{%- for tool_call in message["tool_calls"] -%}
|
||||
{{ '\n<tool_call>{"name": "' + tool_call['function']['name'] + '", "arguments": ' + ('"' + tool_call['function']['arguments'] + '"' if tool_call['function']['arguments'] is string else tool_call['function']['arguments'] | tojson) + '"}</tool_call>' }}
|
||||
{%- endfor %}
|
||||
{%- endif -%}
|
||||
{{ '<end_of_turn>\n' }}
|
||||
{%- endfor -%}
|
||||
{%- if add_generation_prompt -%}
|
||||
{{'<start_of_turn>model\n'}}
|
||||
{%- endif -%}
|
||||
special_tokens:
|
||||
eot_tokens:
|
||||
- <end_of_turn>
|
||||
eos_token: <end_of_turn>
|
||||
additional_special_tokens:
|
||||
- <tool_call>
|
||||
- </tool_call>
|
||||
- <tool_result>
|
||||
- </tool_result>
|
||||
datasets:
|
||||
- path: /workspace/data/datasets/sample.jsonl
|
||||
ds_type: json
|
||||
type: chat_template
|
||||
roles_to_train:
|
||||
- assistant
|
||||
|
||||
val_set_size: 0.0
|
||||
output_dir: /workspace/data/training-runs/Home-Gemma3-270m
|
||||
|
||||
sequence_len: 4096
|
||||
sample_packing: true
|
||||
eval_sample_packing: false
|
||||
|
||||
use_tensorboard: true
|
||||
|
||||
# batch size = 16
|
||||
gradient_accumulation_steps: 16
|
||||
micro_batch_size: 1
|
||||
num_epochs: 1
|
||||
optimizer: adamw_bnb_8bit
|
||||
lr_scheduler: cosine
|
||||
learning_rate: 0.0002
|
||||
|
||||
bf16: true
|
||||
|
||||
gradient_checkpointing: true
|
||||
gradient_checkpointing_kwargs:
|
||||
use_reentrant: false
|
||||
resume_from_checkpoint:
|
||||
logging_steps: 1
|
||||
flash_attention: true
|
||||
|
||||
warmup_ratio: 0.1
|
||||
evals_per_epoch:
|
||||
saves_per_epoch: 1
|
||||
weight_decay: 0.0
|
||||
12
train/train.sh
Executable file
12
train/train.sh
Executable file
@@ -0,0 +1,12 @@
|
||||
#!/bin/bash
|
||||
|
||||
MODEL_NAME=${1}
|
||||
REMOTE_SERVER=${2}
|
||||
|
||||
if [ -z "$MODEL_NAME" ] || [ -z "$REMOTE_SERVER" ]; then
|
||||
echo "Usage: $0 <config-name> <remote-server>"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
scp configs/${MODEL_NAME}.yml ${REMOTE_SERVER}:/mnt/data/training-configs/
|
||||
cat training-job.yml | sed "s/MODEL_NAME/${MODEL_NAME}/g" | kubectl create -f -
|
||||
104
train/training-job.yml
Normal file
104
train/training-job.yml
Normal file
@@ -0,0 +1,104 @@
|
||||
apiVersion: batch/v1
|
||||
kind: Job
|
||||
metadata:
|
||||
generateName: training-job-MODEL_NAME
|
||||
namespace: ai
|
||||
labels:
|
||||
app: training-job
|
||||
spec:
|
||||
ttlSecondsAfterFinished: 604800 # 7 days (7 * 24 * 60 * 60)
|
||||
template:
|
||||
metadata:
|
||||
labels:
|
||||
app: training-job
|
||||
spec:
|
||||
containers:
|
||||
- name: axolotl
|
||||
image: axolotlai/axolotl-cloud:main-py3.11-cu128-2.8.0
|
||||
imagePullPolicy: IfNotPresent
|
||||
command:
|
||||
- axolotl
|
||||
- train
|
||||
- /workspace/configs/MODEL_NAME.yml
|
||||
env:
|
||||
- name: AXOLOTL_DO_NOT_TRACK
|
||||
value: "1"
|
||||
- name: HF_TOKEN
|
||||
valueFrom:
|
||||
secretKeyRef:
|
||||
name: hf-token
|
||||
key: token
|
||||
volumeMounts:
|
||||
- name: training-runs
|
||||
mountPath: /workspace/data/training-runs
|
||||
- name: training-data
|
||||
mountPath: /workspace/data/datasets
|
||||
- name: training-configs
|
||||
mountPath: /workspace/configs
|
||||
- name: hf-cache
|
||||
mountPath: /workspace/data/huggingface-cache
|
||||
resources:
|
||||
limits:
|
||||
nvidia.com/gpu: 2 # number of GPUs to assign to this pod
|
||||
initContainers:
|
||||
- name: preprocess-dataset
|
||||
image: axolotlai/axolotl-cloud:main-py3.11-cu128-2.8.0
|
||||
imagePullPolicy: IfNotPresent
|
||||
command:
|
||||
- axolotl
|
||||
- preprocess
|
||||
- /workspace/configs/MODEL_NAME.yml
|
||||
- --debug
|
||||
env:
|
||||
- name: AXOLOTL_DO_NOT_TRACK
|
||||
value: "1"
|
||||
- name: HF_TOKEN
|
||||
valueFrom:
|
||||
secretKeyRef:
|
||||
name: hf-token
|
||||
key: token
|
||||
volumeMounts:
|
||||
- name: training-runs
|
||||
mountPath: /workspace/data/training-runs
|
||||
- name: training-data
|
||||
mountPath: /workspace/data/datasets
|
||||
- name: training-configs
|
||||
mountPath: /workspace/configs
|
||||
- name: hf-cache
|
||||
mountPath: /workspace/data/huggingface-cache
|
||||
- name: tensorboard
|
||||
image: python:3.11-slim
|
||||
imagePullPolicy: IfNotPresent
|
||||
restartPolicy: Always # mark as sidecar
|
||||
command:
|
||||
- bash
|
||||
- -c
|
||||
- "pip3 install tensorboard && tensorboard --logdir=/workspace/data/training-runs --host=0.0.0.0 --port 8080"
|
||||
ports:
|
||||
- containerPort: 8080
|
||||
name: tensorboard
|
||||
protocol: TCP
|
||||
volumeMounts:
|
||||
- name: training-runs
|
||||
mountPath: /workspace/data/training-runs
|
||||
runtimeClassName: nvidia
|
||||
nodeSelector:
|
||||
nvidia.com/gpu: "true"
|
||||
restartPolicy: OnFailure
|
||||
volumes:
|
||||
- name: training-runs
|
||||
hostPath:
|
||||
path: /mnt/data/training-runs
|
||||
type: DirectoryOrCreate
|
||||
- name: training-data
|
||||
hostPath:
|
||||
path: /mnt/data/training-data
|
||||
type: DirectoryOrCreate
|
||||
- name: training-configs
|
||||
hostPath:
|
||||
path: /mnt/data/training-configs
|
||||
type: DirectoryOrCreate
|
||||
- name: hf-cache
|
||||
hostPath:
|
||||
path: /mnt/data/hf-cache
|
||||
type: DirectoryOrCreate
|
||||
Reference in New Issue
Block a user