From f032389a07cfa44cf888529fb3992cc2b32580b7 Mon Sep 17 00:00:00 2001 From: Huan Chen <142538604+Genesis929@users.noreply.github.com> Date: Thu, 12 Feb 2026 12:55:12 -0800 Subject: [PATCH] chore(tools/bigquery&looker-conversational-analytics): add X-Goog-API-Client header (#2462) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Description Add X-Goog-API-Client header. Change entry point to v1beta. ## PR Checklist > Thank you for opening a Pull Request! Before submitting your PR, there are a > few things you can do to make sure it goes smoothly: - [ ] Make sure you reviewed [CONTRIBUTING.md](https://github.com/googleapis/genai-toolbox/blob/main/CONTRIBUTING.md) - [ ] Make sure to open an issue as a [bug/issue](https://github.com/googleapis/genai-toolbox/issues/new/choose) before writing your code! That way we can discuss the change, evaluate designs, and agree on the general idea - [ ] Ensure the tests and linter pass - [ ] Code coverage does not decrease (if any source code was changed) - [ ] Appropriate docs were updated (if necessary) - [ ] Make sure to add `!` if this involve a breaking change 🛠️ Fixes # --- .../bigqueryconversationalanalytics.go | 11 +++++++---- .../lookerconversationalanalytics.go | 7 ++++--- internal/util/util.go | 3 +++ 3 files changed, 14 insertions(+), 7 deletions(-) diff --git a/internal/tools/bigquery/bigqueryconversationalanalytics/bigqueryconversationalanalytics.go b/internal/tools/bigquery/bigqueryconversationalanalytics/bigqueryconversationalanalytics.go index 196a08b51d..54d29d1605 100644 --- a/internal/tools/bigquery/bigqueryconversationalanalytics/bigqueryconversationalanalytics.go +++ b/internal/tools/bigquery/bigqueryconversationalanalytics/bigqueryconversationalanalytics.go @@ -35,6 +35,8 @@ import ( const resourceType string = "bigquery-conversational-analytics" +const gdaURLFormat = "https://geminidataanalytics.googleapis.com/v1beta/projects/%s/locations/%s:chat" + const instructions = `**INSTRUCTIONS - FOLLOW THESE RULES:** 1. **CONTENT:** Your answer should present the supporting data and then provide a conclusion based on that data. 2. **OUTPUT FORMAT:** Your entire response MUST be in plain text format ONLY. @@ -236,11 +238,12 @@ func (t Tool) Invoke(ctx context.Context, resourceMgr tools.SourceProvider, para if location == "" { location = "us" } - caURL := fmt.Sprintf("https://geminidataanalytics.googleapis.com/v1alpha/projects/%s/locations/%s:chat", projectID, location) + caURL := fmt.Sprintf(gdaURLFormat, projectID, location) headers := map[string]string{ - "Authorization": fmt.Sprintf("Bearer %s", tokenStr), - "Content-Type": "application/json", + "Authorization": fmt.Sprintf("Bearer %s", tokenStr), + "Content-Type": "application/json", + "X-Goog-API-Client": util.GDAClientID, } payload := CAPayload{ @@ -252,7 +255,7 @@ func (t Tool) Invoke(ctx context.Context, resourceMgr tools.SourceProvider, para }, Options: Options{Chart: ChartOptions{Image: ImageOptions{NoImage: map[string]any{}}}}, }, - ClientIdEnum: "GENAI_TOOLBOX", + ClientIdEnum: util.GDAClientID, } // Call the streaming API diff --git a/internal/tools/looker/lookerconversationalanalytics/lookerconversationalanalytics.go b/internal/tools/looker/lookerconversationalanalytics/lookerconversationalanalytics.go index 3eb28c4d5e..c952beb816 100644 --- a/internal/tools/looker/lookerconversationalanalytics/lookerconversationalanalytics.go +++ b/internal/tools/looker/lookerconversationalanalytics/lookerconversationalanalytics.go @@ -267,8 +267,9 @@ func (t Tool) Invoke(ctx context.Context, resourceMgr tools.SourceProvider, para caURL := fmt.Sprintf("https://geminidataanalytics.googleapis.com/v1beta/projects/%s/locations/%s:chat", url.PathEscape(projectID), url.PathEscape(location)) headers := map[string]string{ - "Authorization": fmt.Sprintf("Bearer %s", tokenStr), - "Content-Type": "application/json", + "Authorization": fmt.Sprintf("Bearer %s", tokenStr), + "Content-Type": "application/json", + "X-Goog-API-Client": util.GDAClientID, } payload := CAPayload{ @@ -280,7 +281,7 @@ func (t Tool) Invoke(ctx context.Context, resourceMgr tools.SourceProvider, para }, Options: ConversationOptions{Chart: ChartOptions{Image: ImageOptions{NoImage: map[string]any{}}}}, }, - ClientIdEnum: "GENAI_TOOLBOX", + ClientIdEnum: util.GDAClientID, } // Call the streaming API diff --git a/internal/util/util.go b/internal/util/util.go index 7ac50f6b6e..0b38a225b7 100644 --- a/internal/util/util.go +++ b/internal/util/util.go @@ -28,6 +28,9 @@ import ( "github.com/googleapis/genai-toolbox/internal/telemetry" ) +// GDAClientID is the client ID for Gemini Data Analytics +const GDAClientID = "GENAI_TOOLBOX" + // DecodeJSON decodes a given reader into an interface using the json decoder. func DecodeJSON(r io.Reader, v interface{}) error { defer io.Copy(io.Discard, r) //nolint:errcheck