diff --git a/docs/logging.md b/docs/logging.md index 43ad7d12810f..cf74a55d8fed 100644 --- a/docs/logging.md +++ b/docs/logging.md @@ -210,6 +210,12 @@ These flags log through normal OpenClaw logging, so `openclaw logs --follow` and the Control UI Logs tab show them. Without the flags, the same diagnostics remain available at `debug` level. +`[model-fetch]` start and response metadata (provider, API, model, status, +latency, and request fields such as method, URL, timeout, proxy, and policy) +is always emitted at `info` level regardless of +`OPENCLAW_DEBUG_MODEL_TRANSPORT`, so basic model transport hygiene is visible +without debug flags. + ### Trace correlation File logs are JSONL. When a log call carries a valid diagnostic trace context, diff --git a/src/agents/model-transport-debug.test.ts b/src/agents/model-transport-debug.test.ts new file mode 100644 index 000000000000..65d6d7a7c7e1 --- /dev/null +++ b/src/agents/model-transport-debug.test.ts @@ -0,0 +1,34 @@ +import { describe, expect, it, vi } from "vitest"; +import { emitModelTransportDebug } from "./model-transport-debug.js"; + +describe("emitModelTransportDebug", () => { + function createLogger() { + return { + info: vi.fn(), + debug: vi.fn(), + } as unknown as Parameters[0]; + } + + it("emits model-fetch metadata at info level by default", () => { + const log = createLogger(); + + emitModelTransportDebug( + log, + "[model-fetch] response provider=openai api=chat model=gpt status=200 latencyMs=42", + ); + + expect(log.info).toHaveBeenCalledWith( + "[model-fetch] response provider=openai api=chat model=gpt status=200 latencyMs=42", + ); + expect(log.debug).not.toHaveBeenCalled(); + }); + + it("keeps non-model-fetch transport diagnostics at debug level by default", () => { + const log = createLogger(); + + emitModelTransportDebug(log, "[model-sse] event type=response.output_text.delta"); + + expect(log.debug).toHaveBeenCalledWith("[model-sse] event type=response.output_text.delta"); + expect(log.info).not.toHaveBeenCalled(); + }); +}); diff --git a/src/agents/model-transport-debug.ts b/src/agents/model-transport-debug.ts index b717904b1724..f491e747e29a 100644 --- a/src/agents/model-transport-debug.ts +++ b/src/agents/model-transport-debug.ts @@ -68,9 +68,13 @@ function isModelTransportDebugEnabled(env: ModelTransportDebugEnv = process.env) ); } -/** Emits transport diagnostics at info level only when debug env explicitly enables them. */ +function isModelFetchMetadataMessage(message: string): boolean { + return message.startsWith("[model-fetch]"); +} + +/** Emits model-fetch metadata at info level by default; other diagnostics require debug env. */ export function emitModelTransportDebug(log: SubsystemLogger, message: string): void { - if (isModelTransportDebugEnabled()) { + if (isModelFetchMetadataMessage(message) || isModelTransportDebugEnabled()) { log.info(message); return; }