## Voice Pipeline (P3) - Replace openWakeWord daemon with Wyoming Satellite approach - Add Wyoming Satellite service on port 10700 for HA voice pipeline - Update setup.sh with cross-platform sed compatibility (macOS/Linux) - Add version field to Kokoro TTS voice info - Update launchd service loader to use Wyoming Satellite ## Home Assistant Integration (P4) - Add custom conversation agent component (openclaw_conversation) - Fix: Use IntentResponse instead of plain strings (HA API requirement) - Support both HTTP API and CLI fallback modes - Config flow for easy HA UI setup - Add OpenClaw bridge scripts (Python + Bash) - Add ha-ctl utility for HA entity control - Fix: Use context manager for token file reading - Add HA configuration examples and documentation ## Infrastructure - Add mem0 backup automation (launchd + script) - Add n8n workflow templates (morning briefing, notification router) - Add VS Code workspace configuration - Reorganize model files into categorized folders: - lmstudio-community/ - mlx-community/ - bartowski/ - mradermacher/ ## Documentation - Update PROJECT_PLAN.md with Wyoming Satellite architecture - Update TODO.md with completed Wyoming integration tasks - Add OPENCLAW_INTEGRATION.md for HA setup guide ## Testing - Verified Wyoming services running (STT:10300, TTS:10301, Satellite:10700) - Verified OpenClaw CLI accessibility - Confirmed cross-platform compatibility fixes
244 lines
8.6 KiB
JSON
244 lines
8.6 KiB
JSON
{
|
||
"add_bos_token": false,
|
||
"add_eos_token": false,
|
||
"add_prefix_space": null,
|
||
"added_tokens_decoder": {
|
||
"151643": {
|
||
"content": "<|begin▁of▁sentence|>",
|
||
"lstrip": false,
|
||
"normalized": false,
|
||
"rstrip": false,
|
||
"single_word": false,
|
||
"special": true
|
||
},
|
||
"151644": {
|
||
"content": "<|im_start|>",
|
||
"lstrip": false,
|
||
"normalized": false,
|
||
"rstrip": false,
|
||
"single_word": false,
|
||
"special": true
|
||
},
|
||
"151645": {
|
||
"content": "<|end▁of▁sentence|>",
|
||
"lstrip": false,
|
||
"normalized": false,
|
||
"rstrip": false,
|
||
"single_word": false,
|
||
"special": true
|
||
},
|
||
"151646": {
|
||
"content": "<|object_ref_start|>",
|
||
"lstrip": false,
|
||
"normalized": false,
|
||
"rstrip": false,
|
||
"single_word": false,
|
||
"special": true
|
||
},
|
||
"151647": {
|
||
"content": "<|object_ref_end|>",
|
||
"lstrip": false,
|
||
"normalized": false,
|
||
"rstrip": false,
|
||
"single_word": false,
|
||
"special": true
|
||
},
|
||
"151648": {
|
||
"content": "<|box_start|>",
|
||
"lstrip": false,
|
||
"normalized": false,
|
||
"rstrip": false,
|
||
"single_word": false,
|
||
"special": true
|
||
},
|
||
"151649": {
|
||
"content": "<|box_end|>",
|
||
"lstrip": false,
|
||
"normalized": false,
|
||
"rstrip": false,
|
||
"single_word": false,
|
||
"special": true
|
||
},
|
||
"151650": {
|
||
"content": "<|quad_start|>",
|
||
"lstrip": false,
|
||
"normalized": false,
|
||
"rstrip": false,
|
||
"single_word": false,
|
||
"special": true
|
||
},
|
||
"151651": {
|
||
"content": "<|quad_end|>",
|
||
"lstrip": false,
|
||
"normalized": false,
|
||
"rstrip": false,
|
||
"single_word": false,
|
||
"special": true
|
||
},
|
||
"151652": {
|
||
"content": "<|vision_start|>",
|
||
"lstrip": false,
|
||
"normalized": false,
|
||
"rstrip": false,
|
||
"single_word": false,
|
||
"special": true
|
||
},
|
||
"151653": {
|
||
"content": "<|vision_end|>",
|
||
"lstrip": false,
|
||
"normalized": false,
|
||
"rstrip": false,
|
||
"single_word": false,
|
||
"special": true
|
||
},
|
||
"151654": {
|
||
"content": "<|vision_pad|>",
|
||
"lstrip": false,
|
||
"normalized": false,
|
||
"rstrip": false,
|
||
"single_word": false,
|
||
"special": true
|
||
},
|
||
"151655": {
|
||
"content": "<|image_pad|>",
|
||
"lstrip": false,
|
||
"normalized": false,
|
||
"rstrip": false,
|
||
"single_word": false,
|
||
"special": true
|
||
},
|
||
"151656": {
|
||
"content": "<|video_pad|>",
|
||
"lstrip": false,
|
||
"normalized": false,
|
||
"rstrip": false,
|
||
"single_word": false,
|
||
"special": true
|
||
},
|
||
"151657": {
|
||
"content": "<tool_call>",
|
||
"lstrip": false,
|
||
"normalized": false,
|
||
"rstrip": false,
|
||
"single_word": false,
|
||
"special": false
|
||
},
|
||
"151658": {
|
||
"content": "</tool_call>",
|
||
"lstrip": false,
|
||
"normalized": false,
|
||
"rstrip": false,
|
||
"single_word": false,
|
||
"special": false
|
||
},
|
||
"151659": {
|
||
"content": "<|fim_prefix|>",
|
||
"lstrip": false,
|
||
"normalized": false,
|
||
"rstrip": false,
|
||
"single_word": false,
|
||
"special": false
|
||
},
|
||
"151660": {
|
||
"content": "<|fim_middle|>",
|
||
"lstrip": false,
|
||
"normalized": false,
|
||
"rstrip": false,
|
||
"single_word": false,
|
||
"special": false
|
||
},
|
||
"151661": {
|
||
"content": "<|fim_suffix|>",
|
||
"lstrip": false,
|
||
"normalized": false,
|
||
"rstrip": false,
|
||
"single_word": false,
|
||
"special": false
|
||
},
|
||
"151662": {
|
||
"content": "<|fim_pad|>",
|
||
"lstrip": false,
|
||
"normalized": false,
|
||
"rstrip": false,
|
||
"single_word": false,
|
||
"special": false
|
||
},
|
||
"151663": {
|
||
"content": "<|repo_name|>",
|
||
"lstrip": false,
|
||
"normalized": false,
|
||
"rstrip": false,
|
||
"single_word": false,
|
||
"special": false
|
||
},
|
||
"151664": {
|
||
"content": "<|file_sep|>",
|
||
"lstrip": false,
|
||
"normalized": false,
|
||
"rstrip": false,
|
||
"single_word": false,
|
||
"special": false
|
||
},
|
||
"151665": {
|
||
"content": "<tool_response>",
|
||
"lstrip": false,
|
||
"normalized": false,
|
||
"rstrip": false,
|
||
"single_word": false,
|
||
"special": false
|
||
},
|
||
"151666": {
|
||
"content": "</tool_response>",
|
||
"lstrip": false,
|
||
"normalized": false,
|
||
"rstrip": false,
|
||
"single_word": false,
|
||
"special": false
|
||
},
|
||
"151667": {
|
||
"content": "<think>",
|
||
"lstrip": false,
|
||
"normalized": false,
|
||
"rstrip": false,
|
||
"single_word": false,
|
||
"special": false
|
||
},
|
||
"151668": {
|
||
"content": "</think>",
|
||
"lstrip": false,
|
||
"normalized": false,
|
||
"rstrip": false,
|
||
"single_word": false,
|
||
"special": false
|
||
},
|
||
"151669": {
|
||
"content": "<|User|>",
|
||
"lstrip": false,
|
||
"normalized": false,
|
||
"rstrip": false,
|
||
"single_word": false,
|
||
"special": false
|
||
},
|
||
"151670": {
|
||
"content": "<|Assistant|>",
|
||
"lstrip": false,
|
||
"normalized": false,
|
||
"rstrip": false,
|
||
"single_word": false,
|
||
"special": false
|
||
}
|
||
},
|
||
"bos_token": "<|begin▁of▁sentence|>",
|
||
"chat_template": "{% if not add_generation_prompt is defined %}{% set add_generation_prompt = false %}{% endif %}{% set ns = namespace(is_first=false, is_tool=false, is_output_first=true, system_prompt='', is_first_sp=true, is_last_user=false) %}{%- for message in messages %}{%- if message['role'] == 'system' %}{%- if ns.is_first_sp %}{% set ns.system_prompt = ns.system_prompt + message['content'] %}{% set ns.is_first_sp = false %}{%- else %}{% set ns.system_prompt = ns.system_prompt + '\n\n' + message['content'] %}{%- endif %}{%- endif %}{%- endfor %}{{ bos_token }}{{ ns.system_prompt }}{%- for message in messages %}{% set content = message['content'] %}{%- if message['role'] == 'user' %}{%- set ns.is_tool = false -%}{%- set ns.is_first = false -%}{%- set ns.is_last_user = true -%}{{'<|User|>' + content + '<|Assistant|>'}}{%- endif %}{%- if message['role'] == 'assistant' %}{% if '</think>' in content %}{% set content = content.split('</think>')[-1] %}{% endif %}{% endif %}{%- if message['role'] == 'assistant' and message['tool_calls'] is defined and message['tool_calls'] is not none %}{%- set ns.is_last_user = false -%}{%- if ns.is_tool %}{{'<|tool▁outputs▁end|>'}}{%- endif %}{%- set ns.is_first = false %}{%- set ns.is_tool = false -%}{%- set ns.is_output_first = true %}{%- for tool in message['tool_calls'] %}{%- if not ns.is_first %}{%- if content is none %}{{'<|tool▁calls▁begin|><|tool▁call▁begin|>' + tool['type'] + '<|tool▁sep|>' + tool['function']['name'] + '\n' + '```json' + '\n' + tool['function']['arguments'] + '\n' + '```' + '<|tool▁call▁end|>'}}{%- else %}{{content + '<|tool▁calls▁begin|><|tool▁call▁begin|>' + tool['type'] + '<|tool▁sep|>' + tool['function']['name'] + '\n' + '```json' + '\n' + tool['function']['arguments'] + '\n' + '```' + '<|tool▁call▁end|>'}}{%- endif %}{%- set ns.is_first = true -%}{%- else %}{{'\n' + '<|tool▁call▁begin|>' + tool['type'] + '<|tool▁sep|>' + tool['function']['name'] + '\n' + '```json' + '\n' + tool['function']['arguments'] + '\n' + '```' + '<|tool▁call▁end|>'}}{%- endif %}{%- endfor %}{{'<|tool▁calls▁end|><|end▁of▁sentence|>'}}{%- endif %}{%- if message['role'] == 'assistant' and (message['tool_calls'] is not defined or message['tool_calls'] is none)%}{%- set ns.is_last_user = false -%}{%- if ns.is_tool %}{{'<|tool▁outputs▁end|>' + content + '<|end▁of▁sentence|>'}}{%- set ns.is_tool = false -%}{%- else %}{{content + '<|end▁of▁sentence|>'}}{%- endif %}{%- endif %}{%- if message['role'] == 'tool' %}{%- set ns.is_last_user = false -%}{%- set ns.is_tool = true -%}{%- if ns.is_output_first %}{{'<|tool▁outputs▁begin|><|tool▁output▁begin|>' + content + '<|tool▁output▁end|>'}}{%- set ns.is_output_first = false %}{%- else %}{{'\n<|tool▁output▁begin|>' + content + '<|tool▁output▁end|>'}}{%- endif %}{%- endif %}{%- endfor -%}{% if ns.is_tool %}{{'<|tool▁outputs▁end|>'}}{% endif %}{% if add_generation_prompt and not ns.is_last_user and not ns.is_tool %}{{'<|Assistant|>'}}{% endif %}",
|
||
"clean_up_tokenization_spaces": false,
|
||
"eos_token": "<|end▁of▁sentence|>",
|
||
"extra_special_tokens": {},
|
||
"legacy": true,
|
||
"model_max_length": 131072,
|
||
"pad_token": "<|end▁of▁sentence|>",
|
||
"sp_model_kwargs": {},
|
||
"tokenizer_class": "LlamaTokenizerFast",
|
||
"unk_token": null,
|
||
"use_default_system_prompt": false
|
||
}
|