Skip to content

Add file-based output mode to avoid exceeding GitHub Actions output limits with debug enabled #479

@michalszelagsonos

Description

@michalszelagsonos

TL;DR

When gemini_debug is enabled, the action streams all debug output to the console via tee and writes the full content to GITHUB_OUTPUT. Recent versions of Gemini CLI (post-0.25.x) significantly increased the volume of diagnostic output behind the --debug flag (auth info, API request/error counts, retry events, loop detection). This causes GITHUB_OUTPUT to exceed the ~1MB platform limit, resulting in truncated or failed step outputs.

Proposal

Add a new output_to_file boolean input (default: false) that, when enabled:

  1. Redirects all output to files only — runs with --debug but without tee to the console, same as non-debug redirection but with the --debug flag
  2. Returns file paths as step outputssummary contains the path to gemini-artifacts/stdout.log and error contains the path to gemini-artifacts/stderr.log, instead of the file contents
  3. Produces a compact job summary — instead of dumping the full response/error into the step summary, shows file sizes and paths
  4. Adds new outputsoutput_mode (content or file) and artifacts_dir (path to gemini-artifacts/) so callers can programmatically detect the mode

When output_to_file is not set (or false), behavior is identical to today — full backwards compatibility.

Why file-based output?

  • The gemini-artifacts/ directory already exists and is populated with stdout.log, stderr.log, and telemetry.log on every run
  • Callers can upload these as artifacts (via upload_artifacts: true), filter/process them in subsequent steps, or extract specific data (e.g., stats, traces)
  • This pattern naturally enables future stream-json adoption — once output goes to a file, callers can parse NDJSON to extract both the final response and a step-by-step agent trace

Detailed design

The execution block (lines 294-307) would add a third branch:

if [[ "${GEMINI_DEBUG}" = true ]] && [[ "${OUTPUT_TO_FILE}" = true ]]; then
  # Debug to files only — no console streaming
  if ! gemini --debug --yolo --prompt "${PROMPT}" --output-format json \
    2> "${TEMP_STDERR}" 1> "${TEMP_STDOUT}"; then
    FAILED=true
  fi
elif [[ "${GEMINI_DEBUG}" = true ]]; then
  # Existing behavior: stream to console via tee
  ...
else
  # Existing behavior: silent capture
  ...
fi

The output-setting block (lines 340-356) would conditionally emit paths or content:

if [[ "${OUTPUT_TO_FILE}" = true ]]; then
  echo "gemini_response<<EOF" >> "${GITHUB_OUTPUT}"
  echo "$(pwd)/gemini-artifacts/stdout.log" >> "${GITHUB_OUTPUT}"
  echo "EOF" >> "${GITHUB_OUTPUT}"
else
  # existing content-based output
fi

Related issues

Additional information

I'm happy to submit a PR for this. My use case is a CI code review bot that uses gemini_debug: true with 80+ turn sessions, producing debug output that consistently exceeds GitHub's output limits.

Metadata

Metadata

Assignees

No one assigned

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions