Skip to content

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

Open

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 outputs — summary 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 outputs — output_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.

Activity

  1. gemini-cli commented on Mar 11, 2026

    @gemini-cli
    Contributor

    🤖 Hi @michalszelagsonos, I've received your request, and I'm working on it now! You can track my progress in the logs for more details.

  2. changed the title [-]feat: Add file-based output mode to avoid exceeding GitHub Actions output limits with debug enabled[/-] [+]Add file-based output mode to avoid exceeding GitHub Actions output limits with debug enabled[/+] on Mar 15, 2026
  3. dashesy commented on Apr 16, 2026

    @dashesy

    We hit this consistently when reviewing PRs with larger diffs. Our specific use case is watching long-running reviews live (sometimes 20+ minutes) to detect when the CLI is stuck vs. making progress — so gemini_debug=true is essential for our workflow, but the template-engine size limit makes it unusable as-is.

    Ideal fix from our side: keep gemini_debug=true's live-streaming behavior (tee to stderr), but avoid dumping the unbounded TEMP_STDOUT into $GITHUB_OUTPUT as a fallback.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions