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