diff --git a/ee/config/feature_flags/beta/disable_code_gecko_default.yml b/ee/config/feature_flags/beta/disable_code_gecko_default.yml new file mode 100644 index 0000000000000000000000000000000000000000..5878ce5735f93715371e678215a5d4088b45d855 --- /dev/null +++ b/ee/config/feature_flags/beta/disable_code_gecko_default.yml @@ -0,0 +1,9 @@ +--- +name: disable_code_gecko_default +feature_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/519375 +introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/181852 +rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/520370 +milestone: '17.9' +group: group::code creation +type: beta +default_enabled: false diff --git a/ee/lib/api/code_suggestions.rb b/ee/lib/api/code_suggestions.rb index 684ae4db8f7676ece5f92e4e3e7cbcb5c52e2b41..71967624ec632649caf884ec930036287f4107b4 100644 --- a/ee/lib/api/code_suggestions.rb +++ b/ee/lib/api/code_suggestions.rb @@ -137,6 +137,8 @@ def forbid_direct_access? # we add expanded_ai_logging to header only if current user is internal user, Gitlab::AiGateway.push_feature_flag(:expanded_ai_logging, current_user) + # we add disable_code_gecko_default to gradually roll out code-gecko deprecation + Gitlab::AiGateway.push_feature_flag(:disable_code_gecko_default, current_user) workhorse_headers = Gitlab::Workhorse.send_url( @@ -187,6 +189,9 @@ def forbid_direct_access? details_hash = completion_model_details.current_model + # we add disable_code_gecko_default to gradually roll out code-gecko deprecation + Gitlab::AiGateway.push_feature_flag(:disable_code_gecko_default, current_user) + access = { base_url: ::Gitlab::AiGateway.url, # for development purposes we just return instance JWT, this should not be used in production diff --git a/ee/spec/requests/api/code_suggestions_spec.rb b/ee/spec/requests/api/code_suggestions_spec.rb index 1e6e96812b1aa195e5e4799a1d7a1d2556b2a06f..73c12855c42fa0520c6ec589cee73b278bcdd039 100644 --- a/ee/spec/requests/api/code_suggestions_spec.rb +++ b/ee/spec/requests/api/code_suggestions_spec.rb @@ -53,6 +53,7 @@ stub_feature_flags(incident_fail_over_completion_provider: false) stub_feature_flags(fireworks_qwen_code_completion: false) stub_feature_flags(code_completion_model_opt_out_from_fireworks_qwen: false) + stub_feature_flags(disable_code_gecko_default: false) end shared_examples 'a response' do |case_name| @@ -320,6 +321,19 @@ def request end end + context 'when disable code-gecko default FF is enabled' do + before do + stub_feature_flags(disable_code_gecko_default: true) + end + + it 'workhorse includes the FF in the headers' do + post_api + + _, params = workhorse_send_data + expect(params['Header']["x-gitlab-enabled-feature-flags"][0]).to match("disable_code_gecko_default") + end + end + context 'when incident_fail_over_completion_provider is enabled' do before do stub_feature_flags(incident_fail_over_completion_provider: true) @@ -995,6 +1009,18 @@ def get_user(session): end end + context 'when disable code-gecko default FF is enabled' do + before do + stub_feature_flags(disable_code_gecko_default: true) + end + + it 'includes the FF in the direct access headers' do + post_api + + expect(json_response['headers']['x-gitlab-enabled-feature-flags']).to match('disable_code_gecko_default') + end + end + context 'when code completions is self-hosted' do it 'does not include the model metadata in the direct access details' do create(:ai_feature_setting, provider: :self_hosted, feature: :code_completions) diff --git a/rubocop/cop/gitlab/mark_used_feature_flags.rb b/rubocop/cop/gitlab/mark_used_feature_flags.rb index 190c5ab3de3ee448601ae8d39d02b7abd6dbe738..682d3266067e5d5da40f1643bbfc57e1a6427e24 100644 --- a/rubocop/cop/gitlab/mark_used_feature_flags.rb +++ b/rubocop/cop/gitlab/mark_used_feature_flags.rb @@ -12,8 +12,8 @@ module Gitlab class MarkUsedFeatureFlags < RuboCop::Cop::Base include RuboCop::CodeReuseHelpers - FEATURE_CALLERS = %w[Feature Config::FeatureFlags].freeze - FEATURE_METHODS = %i[enabled? disabled?].freeze + FEATURE_CALLERS = %w[Feature Config::FeatureFlags Gitlab::AiGateway].freeze + FEATURE_METHODS = %i[enabled? disabled? push_feature_flag].freeze EXPERIMENT_METHODS = %i[ experiment ].freeze diff --git a/spec/rubocop/cop/gitlab/mark_used_feature_flags_spec.rb b/spec/rubocop/cop/gitlab/mark_used_feature_flags_spec.rb index 4b300b96af6fd1314e7f5145887ad809ee986907..504480299497607d31bf62dcfe8c0e0455d5acbb 100644 --- a/spec/rubocop/cop/gitlab/mark_used_feature_flags_spec.rb +++ b/spec/rubocop/cop/gitlab/mark_used_feature_flags_spec.rb @@ -46,6 +46,7 @@ class Foo < ApplicationRecord push_frontend_feature_flag Config::FeatureFlags.enabled? ::Gitlab::Ci::Config::FeatureFlags.enabled? + ::Gitlab::AiGateway.push_feature_flag ].each do |feature_flag_method| context "#{feature_flag_method} method" do context 'a string feature flag' do