Skip to content
Snippets Groups Projects
Verified Commit 6ecfb89f authored by Pedro Pombeiro's avatar Pedro Pombeiro Committed by GitLab
Browse files

Merge branch 'acook/fireworks_code_completion' into 'master'

Add fireworks qwen code completion support

See merge request !170503



Merged-by: default avatarPedro Pombeiro <noreply@pedro.pombei.ro>
Approved-by: default avatarPedro Pombeiro <noreply@pedro.pombei.ro>
Reviewed-by: default avatarPedro Pombeiro <noreply@pedro.pombei.ro>
Co-authored-by: Allen Cook's avatarAllen Cook <acook@gitlab.com>
Co-authored-by: default avatarTest <test@example.com>
parents 494bb1a5 a33d16cd
No related branches found
No related tags found
2 merge requests!171309Draft: Fetch issues / MRs / epics count in the sidebar with GraphQL,!170503Add fireworks qwen code completion support
Pipeline #1521901020 passed
---
name: fireworks_qwen_code_completion
feature_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/500742
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/170503
rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/500744
milestone: '17.6'
group: group::code creation
type: beta
default_enabled: false
......@@ -14,6 +14,8 @@ def current_model
return codestral_model_details if use_codestral_for_code_completions?
return fireworks_qwen_2_5_model_details if use_fireworks_qwen_for_code_completions?
# the default behavior is returning an empty hash
# AI Gateway will fall back to the code-gecko model if model details are not provided
{}
......@@ -34,6 +36,13 @@ def codestral_model_details
}
end
def fireworks_qwen_2_5_model_details
{
model_provider: CodeSuggestions::Prompts::CodeCompletion::FireworksQwen::MODEL_PROVIDER,
model_name: CodeSuggestions::Prompts::CodeCompletion::FireworksQwen::MODEL_NAME
}
end
def self_hosted?
feature_setting&.self_hosted?
end
......@@ -42,6 +51,10 @@ def use_codestral_for_code_completions?
Feature.enabled?(:use_codestral_for_code_completions, current_user, type: :beta)
end
def use_fireworks_qwen_for_code_completions?
Feature.enabled?(:fireworks_qwen_code_completion, current_user, type: :beta)
end
def feature_setting
@feature_setting ||= ::Ai::FeatureSetting.find_by_feature(FEATURE_SETTING_NAME)
end
......
# frozen_string_literal: true
module CodeSuggestions
module Prompts
module CodeCompletion
class FireworksQwen < CodeSuggestions::Prompts::Base
GATEWAY_PROMPT_VERSION = 1
MODEL_NAME = 'qwen2p5-coder-7b'
MODEL_PROVIDER = 'fireworks_ai'
def request_params
{
prompt_version: GATEWAY_PROMPT_VERSION,
model_name: MODEL_NAME,
model_provider: MODEL_PROVIDER
}
end
end
end
end
end
......@@ -24,6 +24,9 @@ def prompt
elsif Feature.enabled?(:use_codestral_for_code_completions, current_user, type: :beta)
# codestral hosted on vertex
CodeSuggestions::Prompts::CodeCompletion::VertexCodestral.new(params)
elsif Feature.enabled?(:fireworks_qwen_code_completion, current_user, type: :beta)
# codestral hosted on vertex
CodeSuggestions::Prompts::CodeCompletion::FireworksQwen.new(params)
else
# codegecho hosted on vertex
CodeSuggestions::Prompts::CodeCompletion::VertexAi.new(params)
......
......@@ -9,18 +9,42 @@
describe '#current_model' do
subject(:model_details) { completions_model_details.current_model }
it 'returns the current code completions model metadata' do
expected_medata = {
model_provider: 'vertex-ai',
model_name: 'codestral@2405'
}
context 'when codestral FF is enabled' do
before do
stub_feature_flags(use_codestral_for_code_completions: true)
stub_feature_flags(fireworks_qwen_code_completion: false)
end
it 'returns the correct code completions model metadata' do
expected_medata = {
model_provider: 'vertex-ai',
model_name: 'codestral@2405'
}
expect(model_details).to eq(expected_medata)
end
end
expect(model_details).to eq(expected_medata)
context 'when fireworks qwen FF is enabled' do
before do
stub_feature_flags(use_codestral_for_code_completions: false)
stub_feature_flags(fireworks_qwen_code_completion: true)
end
it 'returns the correct code completions model metadata' do
expected_medata = {
model_provider: 'fireworks_ai',
model_name: 'qwen2p5-coder-7b'
}
expect(model_details).to eq(expected_medata)
end
end
context 'when use_codestral_for_code_completions FF is disabled' do
context 'when code completions FFs are disabled' do
before do
stub_feature_flags(use_codestral_for_code_completions: false)
stub_feature_flags(fireworks_qwen_code_completion: false)
end
it 'returns an empty hash' do
......
# frozen_string_literal: true
require 'spec_helper'
RSpec.describe CodeSuggestions::Prompts::CodeCompletion::FireworksQwen, feature_category: :code_suggestions do
subject(:fireworks_qwen_prompt) { described_class.new({}) }
describe '#request_params' do
it 'returns expected request params' do
request_params = {
prompt_version: 1,
model_name: "qwen2p5-coder-7b",
model_provider: "fireworks_ai"
}
expect(fireworks_qwen_prompt.request_params).to eq(request_params)
end
end
end
......@@ -19,6 +19,7 @@
before do
stub_const('CodeSuggestions::Tasks::Base::AI_GATEWAY_CONTENT_SIZE', 3)
stub_feature_flags(fireworks_qwen_code_completion: false)
end
context 'when using saas model Vertex' do
......@@ -91,6 +92,55 @@
end
end
context 'when using saas model fireworks' do
let(:unsafe_params) do
{
'current_file' => current_file,
'telemetry' => [{ 'model_engine' => 'fireworks-ai' }]
}.with_indifferent_access
end
let(:params) do
{
current_file: current_file,
code_completion_model_family: model_family
}
end
let(:model_family) { :fireworks_ai }
let(:task) do
described_class.new(
params: params,
unsafe_passthrough_params: unsafe_params
)
end
context "when using fireworks qwen for code suggestion task" do
before do
stub_feature_flags(use_codestral_for_code_completions: false)
stub_feature_flags(fireworks_qwen_code_completion: true)
end
it_behaves_like 'code suggestion task' do
let(:expected_body) do
{
"model_name" => "qwen2p5-coder-7b",
"model_provider" => "fireworks_ai",
"current_file" => {
"file_name" => "test.py",
"content_above_cursor" => "sor",
"content_below_cursor" => "som"
},
"telemetry" => [{ "model_engine" => "fireworks-ai" }],
"prompt_version" => 1
}
end
let(:expected_feature_name) { :code_suggestions }
end
end
end
context 'when using self-hosted model' do
let(:unsafe_params) do
{
......
......@@ -238,6 +238,7 @@ def is_even(n: int) ->
allow(service).to receive_message_chain(:add_on_purchases, :assigned_to_user, :uniq_namespace_ids)
.and_return(enabled_by_namespace_ids)
stub_feature_flags(use_codestral_for_code_completions: false)
stub_feature_flags(fireworks_qwen_code_completion: false)
end
shared_examples 'code completions endpoint' do
......@@ -877,9 +878,10 @@ def get_user(session):
expect(json_response).to match(expected_response)
end
context 'when use_codestral_for_code_completions FF is disabled' do
context 'when code completions FFs are disabled' do
before do
stub_feature_flags(use_codestral_for_code_completions: false)
stub_feature_flags(fireworks_qwen_code_completion: false)
end
it 'does not include the model metadata in the direct access details' do
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment