Skip to content

Commit 530af52

Browse files
authored
Merge pull request #2082 from BloggerBust/feat/cli-debug
feat(cli): add `set-debug`/`unset-debug` commands for configurable verbose logging
2 parents 51c7531 + 67b9c23 commit 530af52

1 file changed

Lines changed: 182 additions & 18 deletions

File tree

deepeval/cli/main.py

Lines changed: 182 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,6 @@
2828
from enum import Enum
2929
from pydantic import SecretStr
3030
from deepeval.key_handler import (
31-
KEY_FILE_HANDLER,
32-
KeyValues,
3331
EmbeddingKeyValues,
3432
ModelKeyValues,
3533
)
@@ -46,16 +44,9 @@
4644
render_login_message,
4745
upload_and_open_link,
4846
PROD,
49-
resolve_save_target,
50-
save_environ_to_store,
51-
unset_environ_in_store,
52-
switch_model_provider,
5347
)
5448
from deepeval.confident.api import (
55-
get_confident_api_key,
5649
is_confident,
57-
set_confident_api_key,
58-
CONFIDENT_API_KEY_ENV_VAR,
5950
)
6051

6152
app = typer.Typer(name="deepeval")
@@ -109,7 +100,7 @@ def set_confident_region_command(
109100
# Add flag emojis based on region
110101
flag = "🇺🇸" if region == Regions.US else "🇪🇺"
111102

112-
setting = get_settings()
103+
settings = get_settings()
113104
with settings.edit(save=save) as edit_ctx:
114105
settings.CONFIDENT_REGION = region.value
115106

@@ -282,23 +273,196 @@ def view():
282273
upload_and_open_link(_span=span)
283274

284275

285-
@app.command(name="enable-grpc-logging")
286-
def enable_grpc_logging(save: Optional[str] = None):
276+
@app.command(name="set-debug")
277+
def set_debug(
278+
# Core verbosity
279+
log_level: Optional[str] = typer.Option(
280+
None,
281+
"--log-level",
282+
help="Global LOG_LEVEL (DEBUG|INFO|WARNING|ERROR|CRITICAL|NOTSET).",
283+
),
284+
verbose: Optional[bool] = typer.Option(
285+
None, "--verbose/--no-verbose", help="Toggle DEEPEVAL_VERBOSE_MODE."
286+
),
287+
# Retry logging dials
288+
retry_before_level: Optional[str] = typer.Option(
289+
None,
290+
"--retry-before-level",
291+
help="Log level before a retry attempt (DEBUG|INFO|WARNING|ERROR|CRITICAL|NOTSET or numeric).",
292+
),
293+
retry_after_level: Optional[str] = typer.Option(
294+
None,
295+
"--retry-after-level",
296+
help="Log level after a retry attempt (DEBUG|INFO|WARNING|ERROR|CRITICAL|NOTSET or numeric).",
297+
),
298+
# gRPC visibility
299+
grpc: Optional[bool] = typer.Option(
300+
None, "--grpc/--no-grpc", help="Toggle DEEPEVAL_GRPC_LOGGING."
301+
),
302+
grpc_verbosity: Optional[str] = typer.Option(
303+
None,
304+
"--grpc-verbosity",
305+
help="Set GRPC_VERBOSITY (DEBUG|INFO|ERROR|NONE).",
306+
),
307+
grpc_trace: Optional[str] = typer.Option(
308+
None,
309+
"--grpc-trace",
310+
help=(
311+
"Set GRPC_TRACE to comma-separated tracer names or glob patterns "
312+
"(e.g. 'tcp,http,secure_endpoint', '*' for all, 'list_tracers' to print available)."
313+
),
314+
),
315+
# Confident tracing
316+
trace_verbose: Optional[bool] = typer.Option(
317+
None,
318+
"--trace-verbose/--no-trace-verbose",
319+
help="Enable / disable CONFIDENT_TRACE_VERBOSE.",
320+
),
321+
trace_env: Optional[str] = typer.Option(
322+
None,
323+
"--trace-env",
324+
help='Set CONFIDENT_TRACE_ENVIRONMENT ("development", "staging", "production", etc).',
325+
),
326+
trace_flush: Optional[bool] = typer.Option(
327+
None,
328+
"--trace-flush/--no-trace-flush",
329+
help="Enable / disable CONFIDENT_TRACE_FLUSH.",
330+
),
331+
# Advanced / potentially surprising
332+
error_reporting: Optional[bool] = typer.Option(
333+
None,
334+
"--error-reporting/--no-error-reporting",
335+
help="Enable / disable ERROR_REPORTING.",
336+
),
337+
ignore_errors: Optional[bool] = typer.Option(
338+
None,
339+
"--ignore-errors/--no-ignore-errors",
340+
help="Enable / disable IGNORE_DEEPEVAL_ERRORS (not recommended in normal debugging).",
341+
),
342+
# Persistence
343+
save: Optional[str] = typer.Option(
344+
None,
345+
"--save",
346+
help="Persist CLI parameters as environment variables in a dotenv file. "
347+
"Usage: --save=dotenv[:path] (default: .env.local)",
348+
),
349+
):
287350
"""
288-
Enable verbose gRPC logging for the current process.
289-
Pass --save=dotenv[:path] to persist it (optional).
351+
Configure verbose debug behavior for DeepEval.
352+
353+
This command lets you mix-and-match verbosity flags (global LOG_LEVEL, verbose mode),
354+
retry logger levels, gRPC wire logging, and Confident trace toggles. Values apply
355+
immediately to the current process and can be persisted to a dotenv file with --save.
356+
357+
Examples:
358+
deepeval set-debug --log-level DEBUG --verbose --grpc --retry-before-level DEBUG --retry-after-level INFO
359+
deepeval set-debug --trace-verbose --trace-env staging --save dotenv:.env.local
290360
"""
291361
settings = get_settings()
292362
with settings.edit(save=save) as edit_ctx:
293-
settings.DEEPEVAL_GRPC_LOGGING = True
363+
# Core verbosity
364+
if log_level is not None:
365+
settings.LOG_LEVEL = log_level
366+
if verbose is not None:
367+
settings.DEEPEVAL_VERBOSE_MODE = verbose
368+
369+
# Retry logging
370+
if retry_before_level is not None:
371+
settings.DEEPEVAL_RETRY_BEFORE_LOG_LEVEL = retry_before_level
372+
if retry_after_level is not None:
373+
settings.DEEPEVAL_RETRY_AFTER_LOG_LEVEL = retry_after_level
374+
375+
# gRPC
376+
if grpc is not None:
377+
settings.DEEPEVAL_GRPC_LOGGING = grpc
378+
if grpc_verbosity is not None:
379+
settings.GRPC_VERBOSITY = grpc_verbosity
380+
if grpc_trace is not None:
381+
settings.GRPC_TRACE = grpc_trace
382+
383+
# Confident tracing
384+
if trace_verbose is not None:
385+
settings.CONFIDENT_TRACE_VERBOSE = trace_verbose
386+
if trace_env is not None:
387+
settings.CONFIDENT_TRACE_ENVIRONMENT = trace_env
388+
if trace_flush is not None:
389+
settings.CONFIDENT_TRACE_FLUSH = trace_flush
390+
391+
# Advanced
392+
if error_reporting is not None:
393+
settings.ERROR_REPORTING = error_reporting
394+
if ignore_errors is not None:
395+
settings.IGNORE_DEEPEVAL_ERRORS = ignore_errors
396+
397+
handled, path, updated = edit_ctx.result
398+
399+
if not updated:
400+
# no changes were made, so there is nothing to do.
401+
return
402+
403+
if not handled and save is not None:
404+
print("Unsupported --save option. Use --save=dotenv[:path].")
405+
elif path:
406+
print(
407+
f"Saved environment variables to {path} (ensure it's git-ignored)."
408+
)
409+
else:
410+
print(
411+
"Settings updated for this session. To persist, use --save=dotenv[:path] "
412+
"(default .env.local) or set DEEPEVAL_DEFAULT_SAVE=dotenv:.env.local"
413+
)
414+
415+
print(":loud_sound: Debug options updated.")
416+
417+
418+
@app.command(name="unset-debug")
419+
def unset_debug(
420+
save: Optional[str] = typer.Option(
421+
None,
422+
"--save",
423+
help="Remove only the debug-related environment variables from a dotenv file. "
424+
"Usage: --save=dotenv[:path] (default: .env.local)",
425+
),
426+
):
427+
"""
428+
Restore default behavior by unsetting debug related variables.
429+
430+
Behavior:
431+
- Resets LOG_LEVEL back to 'info'.
432+
- Unsets DEEPEVAL_VERBOSE_MODE, retry log-level overrides, gRPC and Confident trace flags.
433+
- If --save is provided (or DEEPEVAL_DEFAULT_SAVE is set), removes these keys from the target dotenv file.
434+
"""
435+
settings = get_settings()
436+
with settings.edit(save=save) as edit_ctx:
437+
# Back to normal global level
438+
settings.LOG_LEVEL = "info"
439+
settings.CONFIDENT_TRACE_ENVIRONMENT = "development"
440+
settings.CONFIDENT_TRACE_VERBOSE = True
441+
442+
# Clear optional toggles/overrides
443+
settings.DEEPEVAL_VERBOSE_MODE = None
444+
settings.DEEPEVAL_RETRY_BEFORE_LOG_LEVEL = None
445+
settings.DEEPEVAL_RETRY_AFTER_LOG_LEVEL = None
446+
447+
settings.DEEPEVAL_GRPC_LOGGING = None
448+
settings.GRPC_VERBOSITY = None
449+
settings.GRPC_TRACE = None
450+
451+
settings.CONFIDENT_TRACE_FLUSH = None
452+
453+
settings.ERROR_REPORTING = None
454+
settings.IGNORE_DEEPEVAL_ERRORS = None
294455

295456
handled, path, _ = edit_ctx.result
296457

297458
if not handled and save is not None:
298-
# invalid --save format (unsupported)
299459
print("Unsupported --save option. Use --save=dotenv[:path].")
460+
elif path:
461+
print(f"Removed debug-related environment variables from {path}.")
300462
else:
301-
print("gRPC logging enabled.")
463+
print("Debug settings reverted to defaults for this session.")
464+
465+
print(":mute: Debug options unset.")
302466

303467

304468
#############################################
@@ -1336,7 +1500,7 @@ def set_gemini_model_env(
13361500
)
13371501
else:
13381502
print(
1339-
f":raising_hands: Congratulations! You're now using Gemini's model for all evals that require an LLM."
1503+
":raising_hands: Congratulations! You're now using Gemini's model for all evals that require an LLM."
13401504
)
13411505

13421506

0 commit comments

Comments
 (0)