|
28 | 28 | from enum import Enum |
29 | 29 | from pydantic import SecretStr |
30 | 30 | from deepeval.key_handler import ( |
31 | | - KEY_FILE_HANDLER, |
32 | | - KeyValues, |
33 | 31 | EmbeddingKeyValues, |
34 | 32 | ModelKeyValues, |
35 | 33 | ) |
|
46 | 44 | render_login_message, |
47 | 45 | upload_and_open_link, |
48 | 46 | PROD, |
49 | | - resolve_save_target, |
50 | | - save_environ_to_store, |
51 | | - unset_environ_in_store, |
52 | | - switch_model_provider, |
53 | 47 | ) |
54 | 48 | from deepeval.confident.api import ( |
55 | | - get_confident_api_key, |
56 | 49 | is_confident, |
57 | | - set_confident_api_key, |
58 | | - CONFIDENT_API_KEY_ENV_VAR, |
59 | 50 | ) |
60 | 51 |
|
61 | 52 | app = typer.Typer(name="deepeval") |
@@ -109,7 +100,7 @@ def set_confident_region_command( |
109 | 100 | # Add flag emojis based on region |
110 | 101 | flag = "🇺🇸" if region == Regions.US else "🇪🇺" |
111 | 102 |
|
112 | | - setting = get_settings() |
| 103 | + settings = get_settings() |
113 | 104 | with settings.edit(save=save) as edit_ctx: |
114 | 105 | settings.CONFIDENT_REGION = region.value |
115 | 106 |
|
@@ -282,23 +273,196 @@ def view(): |
282 | 273 | upload_and_open_link(_span=span) |
283 | 274 |
|
284 | 275 |
|
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 | +): |
287 | 350 | """ |
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 |
290 | 360 | """ |
291 | 361 | settings = get_settings() |
292 | 362 | 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 |
294 | 455 |
|
295 | 456 | handled, path, _ = edit_ctx.result |
296 | 457 |
|
297 | 458 | if not handled and save is not None: |
298 | | - # invalid --save format (unsupported) |
299 | 459 | print("Unsupported --save option. Use --save=dotenv[:path].") |
| 460 | + elif path: |
| 461 | + print(f"Removed debug-related environment variables from {path}.") |
300 | 462 | else: |
301 | | - print("gRPC logging enabled.") |
| 463 | + print("Debug settings reverted to defaults for this session.") |
| 464 | + |
| 465 | + print(":mute: Debug options unset.") |
302 | 466 |
|
303 | 467 |
|
304 | 468 | ############################################# |
@@ -1336,7 +1500,7 @@ def set_gemini_model_env( |
1336 | 1500 | ) |
1337 | 1501 | else: |
1338 | 1502 | 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." |
1340 | 1504 | ) |
1341 | 1505 |
|
1342 | 1506 |
|
|
0 commit comments