Skip to content

Commit 6e6c1b7

Browse files
DarrenBensonclaude
andcommitted
merge: incorporate PR techartdev#9 debug logging
Adds opt-in CONF_DEBUG_LOGGING toggle for API request tracing. Enhanced debug log to include resolved area name alongside agent ID and session ID. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2 parents a14f2fb + f18b522 commit 6e6c1b7

6 files changed

Lines changed: 52 additions & 1 deletion

File tree

custom_components/openclaw/__init__.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@
6666
CONF_BROWSER_VOICE_LANGUAGE,
6767
CONF_VOICE_PROVIDER,
6868
CONF_THINKING_TIMEOUT,
69+
CONF_DEBUG_LOGGING,
6970
CONTEXT_STRATEGY_TRUNCATE,
7071
DEFAULT_AGENT_ID,
7172
DEFAULT_VOICE_AGENT_ID,
@@ -79,6 +80,7 @@
7980
DEFAULT_BROWSER_VOICE_LANGUAGE,
8081
DEFAULT_VOICE_PROVIDER,
8182
DEFAULT_THINKING_TIMEOUT,
83+
DEFAULT_DEBUG_LOGGING,
8284
DOMAIN,
8385
EVENT_MESSAGE_RECEIVED,
8486
EVENT_TOOL_INVOKED,
@@ -162,6 +164,7 @@ async def async_setup_entry(hass: HomeAssistant, entry: OpenClawConfigEntry) ->
162164
verify_ssl=verify_ssl,
163165
session=session,
164166
agent_id=agent_id,
167+
debug_logging=entry.options.get(CONF_DEBUG_LOGGING, DEFAULT_DEBUG_LOGGING),
165168
)
166169

167170
coordinator = OpenClawCoordinator(hass, client)
@@ -880,6 +883,10 @@ def websocket_get_settings(
880883
CONF_THINKING_TIMEOUT,
881884
DEFAULT_THINKING_TIMEOUT,
882885
),
886+
CONF_DEBUG_LOGGING: options.get(
887+
CONF_DEBUG_LOGGING,
888+
DEFAULT_DEBUG_LOGGING,
889+
),
883890
"language": hass.config.language,
884891
},
885892
)

custom_components/openclaw/api.py

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ def __init__(
5252
verify_ssl: bool = True,
5353
session: aiohttp.ClientSession | None = None,
5454
agent_id: str = "main",
55+
debug_logging: bool = False,
5556
) -> None:
5657
"""Initialize the API client.
5758
@@ -71,6 +72,7 @@ def __init__(
7172
self._verify_ssl = verify_ssl
7273
self._session = session
7374
self._agent_id = agent_id
75+
self._debug_logging = debug_logging
7476
self._base_url = f"{'https' if use_ssl else 'http'}://{host}:{port}"
7577
# ssl=False disables cert verification for self-signed certs;
7678
# ssl=None uses default verification.
@@ -85,6 +87,20 @@ def update_token(self, token: str) -> None:
8587
"""Update the authentication token (e.g., after addon restart)."""
8688
self._token = token
8789

90+
91+
def _log_request(self, label: str, agent_id: str | None, model: str | None, session_id: str | None, headers: dict[str, str]) -> None:
92+
if not self._debug_logging:
93+
return
94+
safe_headers = {k: ("<redacted>" if k.lower() == "authorization" else v) for k, v in headers.items()}
95+
_LOGGER.warning(
96+
"OpenClaw API %s: agent=%s model=%s session=%s headers=%s",
97+
label,
98+
agent_id or self._agent_id or "main",
99+
model,
100+
session_id,
101+
safe_headers,
102+
)
103+
88104
def _headers(
89105
self,
90106
agent_id: str | None = None,
@@ -239,6 +255,8 @@ async def async_send_message(
239255
session = await self._get_session()
240256
url = f"{self._base_url}{API_CHAT_COMPLETIONS}"
241257

258+
self._log_request("chat", agent_id, payload.get("model"), session_id, headers)
259+
242260
try:
243261
async with session.post(
244262
url,
@@ -307,6 +325,8 @@ async def async_stream_message(
307325
session = await self._get_session()
308326
url = f"{self._base_url}{API_CHAT_COMPLETIONS}"
309327

328+
self._log_request("chat", agent_id, payload.get("model"), session_id, headers)
329+
310330
try:
311331
async with session.post(
312332
url,
@@ -372,6 +392,8 @@ async def async_check_connection(self) -> bool:
372392
session = await self._get_session()
373393
url = f"{self._base_url}{API_CHAT_COMPLETIONS}"
374394

395+
self._log_request("chat", agent_id, payload.get("model"), session_id, headers)
396+
375397
try:
376398
async with session.post(
377399
url,

custom_components/openclaw/config_flow.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@
5454
CONF_BROWSER_VOICE_LANGUAGE,
5555
CONF_VOICE_PROVIDER,
5656
CONF_THINKING_TIMEOUT,
57+
CONF_DEBUG_LOGGING,
5758
BROWSER_VOICE_LANGUAGES,
5859
CONTEXT_STRATEGY_CLEAR,
5960
CONTEXT_STRATEGY_TRUNCATE,
@@ -71,6 +72,7 @@
7172
DEFAULT_BROWSER_VOICE_LANGUAGE,
7273
DEFAULT_VOICE_PROVIDER,
7374
DEFAULT_THINKING_TIMEOUT,
75+
DEFAULT_DEBUG_LOGGING,
7476
DEFAULT_VOICE_AGENT_ID,
7577
DOMAIN,
7678
OPENCLAW_CONFIG_REL_PATH,
@@ -537,6 +539,13 @@ async def async_step_init(
537539
CONF_VOICE_PROVIDER,
538540
default=selected_provider,
539541
): vol.In(["browser", "assist_stt"]),
542+
vol.Optional(
543+
CONF_DEBUG_LOGGING,
544+
default=options.get(
545+
CONF_DEBUG_LOGGING,
546+
DEFAULT_DEBUG_LOGGING,
547+
),
548+
): bool,
540549
vol.Optional(
541550
CONF_THINKING_TIMEOUT,
542551
default=options.get(

custom_components/openclaw/const.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@
3939
CONF_VOICE_PROVIDER = "voice_provider"
4040
CONF_BROWSER_VOICE_LANGUAGE = "browser_voice_language"
4141
CONF_THINKING_TIMEOUT = "thinking_timeout"
42+
CONF_DEBUG_LOGGING = "debug_logging"
4243

4344
DEFAULT_AGENT_ID = "main"
4445
DEFAULT_VOICE_AGENT_ID = ""
@@ -53,6 +54,7 @@
5354
DEFAULT_VOICE_PROVIDER = "browser"
5455
DEFAULT_BROWSER_VOICE_LANGUAGE = "auto"
5556
DEFAULT_THINKING_TIMEOUT = 120
57+
DEFAULT_DEBUG_LOGGING = False
5658

5759
BROWSER_VOICE_LANGUAGES: tuple[str, ...] = (
5860
"auto",

custom_components/openclaw/conversation.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,12 +29,14 @@
2929
CONF_AGENT_ID,
3030
CONF_CONTEXT_MAX_CHARS,
3131
CONF_CONTEXT_STRATEGY,
32+
CONF_DEBUG_LOGGING,
3233
CONF_INCLUDE_EXPOSED_CONTEXT,
3334
CONF_VOICE_AGENT_ID,
3435
DEFAULT_ASSIST_SESSION_ID,
3536
DEFAULT_AGENT_ID,
3637
DEFAULT_CONTEXT_MAX_CHARS,
3738
DEFAULT_CONTEXT_STRATEGY,
39+
DEFAULT_DEBUG_LOGGING,
3840
DEFAULT_INCLUDE_EXPOSED_CONTEXT,
3941
DATA_MODEL,
4042
DOMAIN,
@@ -182,6 +184,14 @@ async def async_process(
182184
else:
183185
voice_headers = None
184186

187+
if options.get(CONF_DEBUG_LOGGING, DEFAULT_DEBUG_LOGGING):
188+
_LOGGER.info(
189+
"OpenClaw Assist routing: agent=%s session=%s area=%s",
190+
resolved_agent_id or "main",
191+
conversation_id,
192+
voice_headers.get("x-openclaw-area", "unknown") if voice_headers else "none",
193+
)
194+
185195
try:
186196
full_response = await self._get_response(
187197
client,

custom_components/openclaw/translations/en.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,8 @@
5252
"allow_brave_webspeech": "Allow Web Speech in Brave (experimental)",
5353
"voice_provider": "Voice input provider (browser or HA STT)",
5454
"browser_voice_language": "Browser voice language",
55-
"thinking_timeout": "Response timeout (seconds)"
55+
"thinking_timeout": "Response timeout (seconds)",
56+
"debug_logging": "Enable debug logging"
5657
}
5758
}
5859
}

0 commit comments

Comments
 (0)