Add relay_json module, update dialogue and file_ops, update local settings
This commit is contained in:
+13
-5
@@ -42,6 +42,8 @@ import json
|
||||
import re
|
||||
from typing import Iterable, Optional
|
||||
|
||||
from . import relay_json
|
||||
|
||||
_PREFIXES = ("dialoguectl", "dialogue", "scene")
|
||||
|
||||
# ElevenLabs Text to Dialogue limits (docs, 2026-07): at most 10 distinct
|
||||
@@ -82,11 +84,14 @@ def parse(command: str) -> Optional[dict]:
|
||||
'dialoguectl needs a JSON argument, e.g. dialoguectl {"lines": '
|
||||
'[{"voice": "self", "text": "[cheerfully] hello"}]}'
|
||||
)
|
||||
# Same lenient parse as filectl (see relay_json): machine-written JSON
|
||||
# fails in a handful of repeatable ways, and a stray quote shouldn't cost
|
||||
# a turn — but the repair is reported back rather than hidden.
|
||||
try:
|
||||
data = json.loads(payload)
|
||||
except json.JSONDecodeError as exc:
|
||||
data, repairs = relay_json.loads(payload)
|
||||
except relay_json.RelayJsonError as exc:
|
||||
raise DialogueError(
|
||||
f"couldn't parse the JSON ({exc}). It must be one line of compact "
|
||||
f"couldn't parse the JSON — {exc}\nIt must be one line of compact "
|
||||
"JSON — put line breaks inside text as \\n, never as real newlines."
|
||||
) from exc
|
||||
if not isinstance(data, dict):
|
||||
@@ -109,6 +114,8 @@ def parse(command: str) -> Optional[dict]:
|
||||
lines.append({"voice": voice, "text": text})
|
||||
|
||||
action = {"action": "dialogue", "lines": lines}
|
||||
if repairs:
|
||||
action["_repairs"] = repairs
|
||||
model = str(data.get("model") or data.get("model_id") or "").strip()
|
||||
if model:
|
||||
action["model"] = model
|
||||
@@ -211,9 +218,10 @@ def describe(action: dict, *, played: bool = True) -> str:
|
||||
"""The tool-result string handed back to the server."""
|
||||
lines = action.get("lines") or []
|
||||
voices = sorted({str(line.get("voice") or "self") for line in lines})
|
||||
note = relay_json.repair_note(action.get("_repairs") or [])
|
||||
if not played:
|
||||
return f"[dialogue] not played ({len(lines)} lines)"
|
||||
return f"[dialogue] not played ({len(lines)} lines){note}"
|
||||
return (
|
||||
f"[dialogue] played {len(lines)} line{'s' if len(lines) != 1 else ''} "
|
||||
f"in {len(voices)} voice{'s' if len(voices) != 1 else ''}: {', '.join(voices)}"
|
||||
f"in {len(voices)} voice{'s' if len(voices) != 1 else ''}: {', '.join(voices)}{note}"
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user