Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
fd8b492
feat(ci): add Gemini auto review and invoke workflows
DeanChensj May 13, 2026
6e53472
feat: add support for non-ADK produced input-required events
google-genai-bot May 13, 2026
e377cb5
fix: fallback to project id if crendetials don't contain quota project
wukath May 13, 2026
f9097cb
fix: Fix missing dynamically loaded tools in SkillToolset during the …
google-genai-bot May 13, 2026
e04a468
chore: Remove deprecated CLI flags and version-based service URI hand…
DeanChensj May 13, 2026
c35a579
fix(auth): remove unneeded OAuth flows
google-genai-bot May 13, 2026
cfe8d2c
feat: Add mTLS support to Google Cloud Telemetry exporter
google-genai-bot May 14, 2026
8de1ae8
chore: change name of skill cache to "fetched_skill_cache" to reduce …
wukath May 14, 2026
9f38973
feat: Make Agent Skill description validation more informative
google-genai-bot May 14, 2026
88ebd42
feat: Implement GCPSkillRegistry in ADK
wukath May 14, 2026
27e71f3
chore: Update Gemini Actions workflows for enhanced security and comm…
DeanChensj May 14, 2026
115124c
feat: add support for A2aAgentExecutor factory in to_a2a() function
google-genai-bot May 15, 2026
85f397d
fix: avoid pre-serializing dict values in Interactions API to prevent…
google-genai-bot May 15, 2026
f5b765d
chore(build): exclude nested README.md files from sdist packaging
GWeale May 15, 2026
eed9bd3
fix(evaluation): handle none config in per_turn_user_simulator_quality
GWeale May 15, 2026
bb2efb6
fix: Prevent compaction of events involved in Human-in-the-Loop inter…
GWeale May 15, 2026
9a1e75f
fix(models): preserve string content in Anthropic tool_result blocks
GWeale May 15, 2026
0524797
fix(agents): fix visibility of output_key state delta in callbacks
May 15, 2026
0cb9ae9
fix(models): treat empty GenerateContentResponse without prompt feedb…
GWeale May 15, 2026
6ca6a14
perf: lazy-load service registries and split apps.app to cut cold sta…
GWeale May 15, 2026
7e61b51
fix(tools): preserve code_execution_result and executable_code in Age…
GWeale May 15, 2026
2388090
chore: Remove experimental tag from SkillToolset
wukath May 15, 2026
ec54bd4
perf(utils): cache find_context_parameter introspection
GWeale May 15, 2026
4309159
fix(tools): Prevent AnyIO CancelScope task boundary violations during…
sasha-gitg May 15, 2026
a5cddb8
chore: Remove experimental tag from SkillToolset
google-genai-bot May 15, 2026
790c9be
feat: add general support for Gemini Live API in ADK evaluate
google-genai-bot May 15, 2026
dc3cc2b
fix: raise ValueError for unsupported MIME types in file_data URI path
Raman369AI Mar 27, 2026
c7eb917
test: cover both ValueError branches for file_uri MIME type guard
Raman369AI Apr 25, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
189 changes: 189 additions & 0 deletions .github/workflows/gemini-dispatch.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,189 @@
name: '🔀 Gemini Dispatch'

on:
pull_request_review_comment:
types:
- 'created'
pull_request_review:
types:
- 'submitted'
issue_comment:
types:
- 'created'

defaults:
run:
shell: 'bash'

jobs:
debugger:
if: |-
${{ fromJSON(vars.GEMINI_DEBUG || vars.ACTIONS_STEP_DEBUG || false) }}
runs-on: 'ubuntu-latest'
permissions:
contents: 'read'
steps:
- name: 'Print context for debugging'
env:
DEBUG_event_name: '${{ github.event_name }}'
DEBUG_event__action: '${{ github.event.action }}'
DEBUG_event__comment__author_association: '${{ github.event.comment.author_association }}'
DEBUG_event__issue__author_association: '${{ github.event.issue.author_association }}'
DEBUG_event__pull_request__author_association: '${{ github.event.pull_request.author_association }}'
DEBUG_event__review__author_association: '${{ github.event.review.author_association }}'
DEBUG_event: '${{ toJSON(github.event) }}'
run: |-
env | grep '^DEBUG_'

dispatch:
# Only trigger if user types @gemini-cli and author association is OWNER, MEMBER, or COLLABORATOR
if: |-
github.event.sender.type == 'User' &&
startsWith(github.event.comment.body || github.event.review.body, '@gemini-cli') &&
contains(fromJSON('["OWNER", "MEMBER", "COLLABORATOR"]'), github.event.comment.author_association || github.event.review.author_association)
runs-on: 'ubuntu-latest'
permissions:
contents: 'read'
issues: 'write'
pull-requests: 'write'
outputs:
command: '${{ steps.extract_command.outputs.command }}'
request: '${{ steps.extract_command.outputs.request }}'
additional_context: '${{ steps.extract_command.outputs.additional_context }}'
issue_number: '${{ github.event.pull_request.number || github.event.issue.number }}'
steps:
- name: 'Mint identity token'
id: 'mint_identity_token'
if: |-
${{ vars.APP_ID }}
uses: 'actions/create-github-app-token@29824e69f54612133e76f7eaac726eef6c875baf' # ratchet:actions/create-github-app-token@v2
with:
app-id: '${{ vars.APP_ID }}'
private-key: '${{ secrets.APP_PRIVATE_KEY }}'
permission-contents: 'read'
permission-issues: 'write'
permission-pull-requests: 'write'

- name: 'Extract command'
id: 'extract_command'
uses: 'actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd' # ratchet:actions/github-script@v8.0.0
env:
REQUEST: '${{ github.event.comment.body || github.event.review.body }}'
IS_PR: '${{ !!(github.event.pull_request || github.event.issue.pull_request) }}'
with:
script: |
const request = process.env.REQUEST;
const isPr = process.env.IS_PR === 'true';
core.setOutput('request', request);

// Ensure request is on a PR targeting the main branch
let baseRef = '';
if (context.eventName === 'pull_request_review' || context.eventName === 'pull_request_review_comment') {
baseRef = context.payload.pull_request.base.ref;
} else if (context.eventName === 'issue_comment' && context.payload.issue.pull_request) {
const pr = await github.rest.pulls.get({
owner: context.repo.owner,
repo: context.repo.repo,
pull_number: context.payload.issue.number
});
baseRef = pr.data.base.ref;
}

if (isPr && baseRef !== 'main') {
console.log(`Skipping: PR targets '${baseRef}', but only 'main' is allowed.`);
core.setOutput('command', 'fallthrough');
return;
}

if (request.startsWith("@gemini-cli /review")) {
if (isPr) {
core.setOutput('command', 'review');
const additionalContext = request.replace(/^@gemini-cli \/review/, '').trim();
core.setOutput('additional_context', additionalContext);
} else {
core.setOutput('command', 'fallthrough');
}
} else if (request.startsWith("@gemini-cli")) {
const additionalContext = request.replace(/^@gemini-cli/, '').trim();
core.setOutput('command', 'invoke');
core.setOutput('additional_context', additionalContext);
} else {
core.setOutput('command', 'fallthrough');
}

- name: 'Acknowledge request'
env:
GITHUB_TOKEN: '${{ steps.mint_identity_token.outputs.token || secrets.GITHUB_TOKEN || github.token }}'
ISSUE_NUMBER: '${{ github.event.pull_request.number || github.event.issue.number }}'
MESSAGE: |-
🤖 Hi @${{ github.actor }}, I've received your request, and I'm working on it now! You can track my progress [in the logs](${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}) for more details.
REPOSITORY: '${{ github.repository }}'
run: |-
gh issue comment "${ISSUE_NUMBER}" \
--body "${MESSAGE}" \
--repo "${REPOSITORY}"

review:
needs: 'dispatch'
if: |-
${{ needs.dispatch.outputs.command == 'review' }}
uses: './.github/workflows/gemini-review.yml'
permissions:
contents: 'read'
id-token: 'write'
issues: 'write'
pull-requests: 'write'
with:
additional_context: '${{ needs.dispatch.outputs.additional_context }}'
secrets: 'inherit'

invoke:
needs: 'dispatch'
if: |-
${{ needs.dispatch.outputs.command == 'invoke' }}
uses: './.github/workflows/gemini-invoke.yml'
permissions:
contents: 'read'
id-token: 'write'
issues: 'write'
pull-requests: 'write'
with:
additional_context: '${{ needs.dispatch.outputs.additional_context }}'
secrets: 'inherit'

fallthrough:
needs:
- 'dispatch'
- 'review'
- 'invoke'
if: |-
${{ always() && !cancelled() && (failure() || needs.dispatch.outputs.command == 'fallthrough') }}
runs-on: 'ubuntu-latest'
permissions:
contents: 'read'
issues: 'write'
pull-requests: 'write'
steps:
- name: 'Mint identity token'
id: 'mint_identity_token'
if: |-
${{ vars.APP_ID }}
uses: 'actions/create-github-app-token@29824e69f54612133e76f7eaac726eef6c875baf' # ratchet:actions/create-github-app-token@v2
with:
app-id: '${{ vars.APP_ID }}'
private-key: '${{ secrets.APP_PRIVATE_KEY }}'
permission-contents: 'read'
permission-issues: 'write'
permission-pull-requests: 'write'

- name: 'Send failure comment'
env:
GITHUB_TOKEN: '${{ steps.mint_identity_token.outputs.token || secrets.GITHUB_TOKEN || github.token }}'
ISSUE_NUMBER: '${{ github.event.pull_request.number || github.event.issue.number }}'
MESSAGE: |-
🤖 I'm sorry @${{ github.actor }}, but I was unable to process your request. Please [see the logs](${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}) for more details.
REPOSITORY: '${{ github.repository }}'
run: |-
gh issue comment "${ISSUE_NUMBER}" \
--body "${MESSAGE}" \
--repo "${REPOSITORY}"
104 changes: 104 additions & 0 deletions .github/workflows/gemini-invoke.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,104 @@
name: '▶️ Gemini Invoke'

on:
workflow_call:
inputs:
additional_context:
type: 'string'
description: 'Any additional context from the request'
required: false

concurrency:
group: '${{ github.workflow }}-invoke-${{ github.event_name }}-${{ github.event.pull_request.number || github.event.issue.number }}'
cancel-in-progress: false

defaults:
run:
shell: 'bash'

jobs:
invoke:
runs-on: 'ubuntu-latest'
permissions:
contents: 'read'
id-token: 'write'
issues: 'write'
pull-requests: 'write'
steps:
- name: 'Mint identity token'
id: 'mint_identity_token'
if: |-
${{ vars.APP_ID }}
uses: 'actions/create-github-app-token@29824e69f54612133e76f7eaac726eef6c875baf' # ratchet:actions/create-github-app-token@v2
with:
app-id: '${{ vars.APP_ID }}'
private-key: '${{ secrets.APP_PRIVATE_KEY }}'
permission-contents: 'read'
permission-issues: 'write'
permission-pull-requests: 'write'

- name: 'Checkout Code'
uses: 'actions/checkout@v4' # ratchet:exclude

- name: 'Run Gemini CLI'
id: 'run_gemini'
uses: 'google-github-actions/run-gemini-cli@v0' # ratchet:exclude
env:
TITLE: '${{ github.event.pull_request.title || github.event.issue.title }}'
DESCRIPTION: '${{ github.event.pull_request.body || github.event.issue.body }}'
EVENT_NAME: '${{ github.event_name }}'
GITHUB_TOKEN: '${{ steps.mint_identity_token.outputs.token || secrets.GITHUB_TOKEN || github.token }}'
IS_PULL_REQUEST: '${{ !!github.event.pull_request }}'
ISSUE_NUMBER: '${{ github.event.pull_request.number || github.event.issue.number }}'
REPOSITORY: '${{ github.repository }}'
ADDITIONAL_CONTEXT: '${{ inputs.additional_context }}'
# Required to allow the Gemini CLI to process files in the ephemeral GitHub Actions runner
GEMINI_CLI_TRUST_WORKSPACE: 'true'
with:
gcp_location: '${{ vars.GOOGLE_CLOUD_LOCATION }}'
gcp_project_id: '${{ vars.GOOGLE_CLOUD_PROJECT }}'
gcp_service_account: '${{ vars.SERVICE_ACCOUNT_EMAIL }}'
gcp_workload_identity_provider: '${{ vars.GCP_WIF_PROVIDER }}'
gemini_api_key: '${{ secrets.GOOGLE_API_KEY }}'
gemini_cli_version: '${{ vars.GEMINI_CLI_VERSION }}'
gemini_debug: '${{ fromJSON(vars.GEMINI_DEBUG || vars.ACTIONS_STEP_DEBUG || false) }}'
gemini_model: '${{ vars.GEMINI_MODEL }}'
google_api_key: '${{ secrets.GOOGLE_API_KEY }}'
use_gemini_code_assist: '${{ vars.GOOGLE_GENAI_USE_GCA }}'
use_vertex_ai: '${{ vars.GOOGLE_GENAI_USE_VERTEXAI }}'
upload_artifacts: '${{ vars.UPLOAD_ARTIFACTS }}'
workflow_name: 'gemini-invoke'
# Assistant workflows can be triggered by comments on either Issues or PRs.
# We explicitly map both fields so the CLI can correctly categorize the interaction.
github_pr_number: '${{ github.event.pull_request.number }}'
github_issue_number: '${{ github.event.issue.number }}'
settings: |-
{
"model": {
"maxSessionTurns": 25
},
"telemetry": {
"enabled": true,
"target": "local",
"outfile": ".gemini/telemetry.log"
},
"mcpServers": {
"github": {
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"-e",
"GITHUB_PERSONAL_ACCESS_TOKEN",
"ghcr.io/github/github-mcp-server:v0.27.0"
],
"env": {
"GITHUB_PERSONAL_ACCESS_TOKEN": "${{ steps.mint_identity_token.outputs.token || secrets.GITHUB_TOKEN || github.token }}"
}
}
}
}
prompt: |-
/gemini-invoke
[IMPORTANT] Do not generate execution plans and do not ask for approval (such as suggesting `@gemini-cli /approve`). Perform the requested task or answer the question directly and immediately.
100 changes: 100 additions & 0 deletions .github/workflows/gemini-review.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,100 @@
name: '🔎 Gemini Review'

on:
workflow_call:
inputs:
additional_context:
type: 'string'
description: 'Any additional context from the request'
required: false

concurrency:
group: '${{ github.workflow }}-review-${{ github.event_name }}-${{ github.event.pull_request.number || github.event.issue.number }}'
cancel-in-progress: true

defaults:
run:
shell: 'bash'

jobs:
review:
runs-on: 'ubuntu-latest'
timeout-minutes: 7
permissions:
contents: 'read'
id-token: 'write'
issues: 'write'
pull-requests: 'write'
steps:
- name: 'Mint identity token'
id: 'mint_identity_token'
if: |-
${{ vars.APP_ID }}
uses: 'actions/create-github-app-token@29824e69f54612133e76f7eaac726eef6c875baf' # ratchet:actions/create-github-app-token@v2
with:
app-id: '${{ vars.APP_ID }}'
private-key: '${{ secrets.APP_PRIVATE_KEY }}'
permission-contents: 'read'
permission-issues: 'write'
permission-pull-requests: 'write'

- name: 'Checkout repository'
uses: 'actions/checkout@v4' # ratchet:exclude

- name: 'Run Gemini pull request review'
uses: 'google-github-actions/run-gemini-cli@v0' # ratchet:exclude
id: 'gemini_pr_review'
env:
GITHUB_TOKEN: '${{ steps.mint_identity_token.outputs.token || secrets.GITHUB_TOKEN || github.token }}'
ISSUE_TITLE: '${{ github.event.pull_request.title || github.event.issue.title }}'
ISSUE_BODY: '${{ github.event.pull_request.body || github.event.issue.body }}'
PULL_REQUEST_NUMBER: '${{ github.event.pull_request.number || github.event.issue.number }}'
REPOSITORY: '${{ github.repository }}'
ADDITIONAL_CONTEXT: '${{ inputs.additional_context }}'
GEMINI_API_KEY: '${{ secrets.GOOGLE_API_KEY }}'
# Required to allow the Gemini CLI to process files in the ephemeral GitHub Actions runner
GEMINI_CLI_TRUST_WORKSPACE: 'true'
with:
gcp_location: '${{ vars.GOOGLE_CLOUD_LOCATION }}'
gcp_project_id: '${{ vars.GOOGLE_CLOUD_PROJECT }}'
gcp_service_account: '${{ vars.SERVICE_ACCOUNT_EMAIL }}'
gcp_workload_identity_provider: '${{ vars.GCP_WIF_PROVIDER }}'
gemini_api_key: '${{ secrets.GOOGLE_API_KEY }}'
gemini_cli_version: '${{ vars.GEMINI_CLI_VERSION }}'
gemini_debug: '${{ fromJSON(vars.GEMINI_DEBUG || vars.ACTIONS_STEP_DEBUG || false) }}'
gemini_model: '${{ vars.GEMINI_MODEL }}'
google_api_key: '${{ secrets.GOOGLE_API_KEY }}'
use_gemini_code_assist: '${{ vars.GOOGLE_GENAI_USE_GCA }}'
use_vertex_ai: '${{ vars.GOOGLE_GENAI_USE_VERTEXAI }}'
upload_artifacts: '${{ vars.UPLOAD_ARTIFACTS }}'
workflow_name: 'gemini-review'
# Explicitly set the PR number to handle `issue_comment` triggers (which GitHub treats as issues, not PRs)
github_pr_number: '${{ github.event.pull_request.number || github.event.issue.number }}'
settings: |-
{
"model": {
"maxSessionTurns": 25
},
"telemetry": {
"enabled": true,
"target": "local",
"outfile": ".gemini/telemetry.log"
},
"mcpServers": {
"github": {
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"-e",
"GITHUB_PERSONAL_ACCESS_TOKEN",
"ghcr.io/github/github-mcp-server:v0.27.0"
],
"env": {
"GITHUB_PERSONAL_ACCESS_TOKEN": "${{ steps.mint_identity_token.outputs.token || secrets.GITHUB_TOKEN || github.token }}"
}
}
}
}
prompt: 'Please use the pull_request_read tool to read pull request #${{ github.event.pull_request.number || github.event.issue.number }}. Analyze the code for bugs, security issues, and best practices. Then, use the add_comment_to_pending_review and pull_request_review_write tools to post your review directly on pull request #${{ github.event.pull_request.number || github.event.issue.number }}.'
Loading
Loading