Skip to content

Conversation

@sususu98
Copy link
Contributor

Summary

Fixes #1297

When using Gemini API format with Antigravity backend, the response incorrectly contains cpaUsageMetadata instead of the standard usageMetadata field.

Changes

  • Add restoreUsageMetadata() function to rename cpaUsageMetadata back to usageMetadata
  • Apply restoration in both streaming (ConvertAntigravityResponseToGemini) and non-streaming (ConvertAntigravityResponseToGeminiNonStream) responses
  • Add unit tests for the fix

Root Cause

In #747, StripUsageMetadataFromJSON was introduced to rename usageMetadata to cpaUsageMetadata in non-terminal chunks. This was designed for the Claude translator to consume, but the Gemini translator was not updated to restore the original field name before returning responses to clients.

Testing

go test ./internal/translator/antigravity/gemini/... -v

All tests pass including new tests for restoreUsageMetadata.

…ravity

When using Gemini API format with Antigravity backend, the executor
renames usageMetadata to cpaUsageMetadata in non-terminal chunks.
The Gemini translator was returning this internal field name directly
to clients instead of the standard usageMetadata field.

Add restoreUsageMetadata() to rename cpaUsageMetadata back to
usageMetadata before returning responses to clients.
@gemini-code-assist
Copy link
Contributor

Summary of Changes

Hello @sususu98, I'm Gemini Code Assist1! I'm currently reviewing this pull request and will post my feedback shortly. In the meantime, here's a summary to help you and other reviewers quickly get up to speed!

This pull request addresses an issue where Gemini API responses, when processed through the Antigravity backend, incorrectly contained cpaUsageMetadata instead of the standard usageMetadata field. The change ensures that all Gemini responses now correctly expose usageMetadata, aligning with the expected API format and improving client compatibility.

Highlights

  • Usage Metadata Restoration: Introduced a new restoreUsageMetadata() function to correctly rename cpaUsageMetadata back to usageMetadata in Gemini API responses.
  • API Response Consistency: Applied the restoreUsageMetadata() function to both streaming (ConvertAntigravityResponseToGemini) and non-streaming (ConvertAntigravityResponseToGeminiNonStream) Gemini responses to ensure consistent output.
  • Test Coverage: Added comprehensive unit tests for the new restoreUsageMetadata() function and its integration into the Gemini response conversion logic.

🧠 New Feature in Public Preview: You can now enable Memory to help Gemini Code Assist learn from your team's feedback. This makes future code reviews more consistent and personalized to your project's style. Click here to enable Memory in your admin console.

Using Gemini Code Assist

The full guide for Gemini Code Assist can be found on our documentation page, here are some quick tips.

Invoking Gemini

You can request assistance from Gemini at any point by creating a comment using either /gemini <command> or @gemini-code-assist <command>. Below is a summary of the supported commands on the current page.

Feature Command Description
Code Review /gemini review Performs a code review for the current pull request in its current state.
Pull Request Summary /gemini summary Provides a summary of the current pull request in its current state.
Comment @gemini-code-assist Responds in comments when explicitly tagged, both in pull request comments and review comments.
Help /gemini help Displays a list of available commands.

Customization

To customize Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a .gemini/ folder in the base of the repository. Detailed instructions can be found here.

Limitations & Feedback

Gemini Code Assist may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counter productive. You can react with 👍 and 👎 on @gemini-code-assist comments. If you're interested in giving your feedback about your experience with Gemini Code Assist for Github and other Google products, sign up here.

You can also get AI-powered code generation, chat, as well as code reviews directly in the IDE at no cost with the Gemini Code Assist IDE Extension.

Footnotes

  1. Review the Privacy Notices, Generative AI Prohibited Use Policy, Terms of Service, and learn how to configure Gemini Code Assist in GitHub here. Gemini can make mistakes, so double check it and use code with caution.

Copy link
Contributor

@gemini-code-assist gemini-code-assist bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

This pull request correctly fixes an issue where cpaUsageMetadata was being returned instead of the expected usageMetadata. The solution, which involves adding a restoreUsageMetadata function and applying it in both streaming and non-streaming response handlers, is well-implemented. The accompanying unit tests are thorough and cover the new logic effectively. I have one suggestion to improve the error handling in the new restoreUsageMetadata function to make it more robust against potential data inconsistencies.

Comment on lines +96 to +97
chunk, _ = sjson.SetRawBytes(chunk, "usageMetadata", []byte(cpaUsage.Raw))
chunk, _ = sjson.DeleteBytes(chunk, "cpaUsageMetadata")
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

Ignoring errors from sjson operations can lead to returning a partially modified JSON object. If SetRawBytes succeeds but DeleteBytes fails, the resulting chunk will contain both usageMetadata and cpaUsageMetadata. It's safer to handle these errors and return the original chunk on failure to ensure the rename operation is atomic.

                res, err := sjson.SetRawBytes(chunk, "usageMetadata", []byte(cpaUsage.Raw))
                if err != nil {
                        return chunk
                }
                res, err = sjson.DeleteBytes(res, "cpaUsageMetadata")
                if err != nil {
                        return chunk
                }
                chunk = res

@luispater luispater merged commit da0bbf2 into router-for-me:dev Jan 29, 2026
1 of 2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants