Skip to content
代码片段 群组 项目
未验证 提交 571e1bce 编辑于 作者: Eduardo Bonet's avatar Eduardo Bonet 提交者: GitLab
浏览文件

Merge branch 'id-model-metadata-for-completions' into 'master'

Send model metadata for completion features

See merge request https://gitlab.com/gitlab-org/gitlab/-/merge_requests/184160



Merged-by: default avatarEduardo Bonet <ebonet@gitlab.com>
Approved-by: default avatarEduardo Bonet <ebonet@gitlab.com>
Reviewed-by: default avatarIgor Drozdov <idrozdov@gitlab.com>
Reviewed-by: default avatarEduardo Bonet <ebonet@gitlab.com>
Co-authored-by: default avatarIgor Drozdov <idrozdov@gitlab.com>
No related branches found
No related tags found
2 合并请求!3031Merge per-main-jh to main-jh by luzhiyuan,!3030Merge per-main-jh to main-jh
...@@ -296,26 +296,7 @@ def unavailable_resources_params ...@@ -296,26 +296,7 @@ def unavailable_resources_params
attr_reader :stream_response_handler attr_reader :stream_response_handler
def model_metadata_params def model_metadata_params
if chat_feature_setting&.self_hosted? ::Gitlab::Llm::AiGateway::ModelMetadata.new(feature_setting: chat_feature_setting).to_params
self_hosted_model = chat_feature_setting.self_hosted_model
return {
provider: :openai, # for self-hosted models we support Messages API format at the moment
name: self_hosted_model.model,
endpoint: self_hosted_model.endpoint,
api_key: self_hosted_model.api_token,
identifier: self_hosted_model.identifier
}
end
return unless ::Ai::AmazonQ.connected?
{
provider: :amazon_q,
name: :amazon_q,
role_arn: ::Ai::Setting.instance.amazon_q_role_arn
}
end end
def conversation def conversation
......
...@@ -44,16 +44,7 @@ def post_process(response) ...@@ -44,16 +44,7 @@ def post_process(response)
end end
def request! def request!
ai_client = ::Gitlab::Llm::AiGateway::Client.new(user, service_name: service_name, response = perform_ai_gateway_request!
tracking_context: tracking_context)
request_body = { 'inputs' => inputs }
request_body['prompt_version'] = prompt_version unless prompt_version.nil?
response = ai_client.complete(
url: "#{::Gitlab::AiGateway.url}/v1/prompts/#{prompt_message.ai_action}",
body: request_body
)
return if response&.body.blank? return if response&.body.blank?
return Gitlab::Json.parse(response.body) if response&.success? return Gitlab::Json.parse(response.body) if response&.success?
...@@ -67,6 +58,22 @@ def request! ...@@ -67,6 +58,22 @@ def request!
{ 'detail' => DEFAULT_ERROR } { 'detail' => DEFAULT_ERROR }
end end
def perform_ai_gateway_request!
ai_client = ::Gitlab::Llm::AiGateway::Client.new(user, service_name: service_name,
tracking_context: tracking_context)
request_body = { 'inputs' => inputs }
request_body['prompt_version'] = prompt_version unless prompt_version.nil?
model_metadata_params = ::Gitlab::Llm::AiGateway::ModelMetadata.new.to_params
request_body['model_metadata'] = model_metadata_params if model_metadata_params.present?
ai_client.complete(
url: "#{::Gitlab::AiGateway.url}/v1/prompts/#{prompt_message.ai_action}",
body: request_body
)
end
def service_name def service_name
prompt_message.ai_action.to_sym prompt_message.ai_action.to_sym
end end
......
...@@ -53,12 +53,7 @@ def inputs ...@@ -53,12 +53,7 @@ def inputs
private private
def request! def request!
ai_client = ::Gitlab::Llm::AiGateway::Client.new(user, service_name: service_name, response = perform_ai_gateway_request!
tracking_context: tracking_context)
response = ai_client.complete(
url: "#{::Gitlab::AiGateway.url}/v1/prompts/#{prompt_message.ai_action}",
body: { 'inputs' => inputs }
)
raise EmptyResponseError, "Empty response from LLM" if response&.body.blank? raise EmptyResponseError, "Empty response from LLM" if response&.body.blank?
......
# frozen_string_literal: true
module Gitlab
module Llm
module AiGateway
class ModelMetadata
def initialize(feature_setting: nil)
@feature_setting = feature_setting
end
def to_params
return self_hosted_params if feature_setting&.self_hosted?
amazon_q_params if ::Ai::AmazonQ.connected?
end
private
attr_reader :feature_setting
def self_hosted_params
self_hosted_model = feature_setting.self_hosted_model
{
provider: self_hosted_model.provider,
name: self_hosted_model.model,
endpoint: self_hosted_model.endpoint,
api_key: self_hosted_model.api_token,
identifier: self_hosted_model.identifier
}
end
def amazon_q_params
{
provider: :amazon_q,
name: :amazon_q,
role_arn: ::Ai::Setting.instance.amazon_q_role_arn
}
end
end
end
end
end
...@@ -133,25 +133,9 @@ def request_body_agent(inputs:, unit_primitive: nil, prompt_version: nil) ...@@ -133,25 +133,9 @@ def request_body_agent(inputs:, unit_primitive: nil, prompt_version: nil)
feature_setting = chat_feature_setting(unit_primitive: unit_primitive) feature_setting = chat_feature_setting(unit_primitive: unit_primitive)
if feature_setting&.self_hosted? model_metadata_params =
self_hosted_model = feature_setting.self_hosted_model ::Gitlab::Llm::AiGateway::ModelMetadata.new(feature_setting: feature_setting).to_params
params[:model_metadata] = model_metadata_params if model_metadata_params.present?
params[:model_metadata] = {
provider: self_hosted_model.provider,
name: self_hosted_model.model,
endpoint: self_hosted_model.endpoint,
api_key: self_hosted_model.api_token,
identifier: self_hosted_model.identifier
}
end
if ::Ai::AmazonQ.connected?
params[:model_metadata] = {
provider: :amazon_q,
name: :amazon_q,
role_arn: ::Ai::Setting.instance.amazon_q_role_arn
}
end
params params
end end
......
...@@ -97,6 +97,7 @@ ...@@ -97,6 +97,7 @@
let(:processed_response) { { 'detail' => 'An unexpected error has occurred.' } } let(:processed_response) { { 'detail' => 'An unexpected error has occurred.' } }
before do before do
allow(::Ai::AmazonQ).to receive(:connected?).and_return(false)
allow(Gitlab::Json).to receive(:parse).and_raise(StandardError) allow(Gitlab::Json).to receive(:parse).and_raise(StandardError)
end end
...@@ -143,5 +144,33 @@ ...@@ -143,5 +144,33 @@
is_expected.to be(result) is_expected.to be(result)
end end
end end
context 'when model_metadata is provided' do
it 'includes model_metadata in the request body' do
params = {
provider: 'provider',
name: 'model',
endpoint: 'http://example.com',
identifier: 'identifier'
}
expect_next_instance_of(::Gitlab::Llm::AiGateway::ModelMetadata) do |instance|
expect(instance).to receive(:to_params).and_return(params)
end
expect(client).to receive(:complete).with(
url: "#{Gitlab::AiGateway.url}/v1/prompts/#{ai_action}",
body: { 'inputs' => inputs, 'model_metadata' => params }
).and_return(http_response)
expect(response_modifier_class).to receive(:new).with(processed_response)
.and_return(response_modifier)
expect(Gitlab::Llm::GraphqlSubscriptionResponseService).to receive(:new)
.with(user, resource, response_modifier, options: response_options).and_return(response_service)
expect(response_service).to receive(:execute).and_return(result)
is_expected.to be(result)
end
end
end end
end end
# frozen_string_literal: true
require 'spec_helper'
RSpec.describe Gitlab::Llm::AiGateway::ModelMetadata, feature_category: :ai_abstraction_layer do
let_it_be(:self_hosted_model) { create(:ai_self_hosted_model) }
let_it_be(:feature_setting) { create(:ai_feature_setting, self_hosted_model: self_hosted_model) }
describe '#to_params' do
context 'when feature_setting is self-hosted' do
it 'returns self-hosted params' do
model_metadata = described_class.new(feature_setting: feature_setting)
expect(model_metadata.to_params).to eq({
provider: self_hosted_model.provider,
name: self_hosted_model.model,
endpoint: self_hosted_model.endpoint,
api_key: self_hosted_model.api_token,
identifier: self_hosted_model.identifier
})
end
end
context 'when feature_setting is not self-hosted and Ai::AmazonQ is connected' do
before do
allow(::Ai::AmazonQ).to receive(:connected?).and_return(true)
::Ai::Setting.instance.update!(amazon_q_role_arn: "role-arn")
end
it 'returns amazon_q params' do
model_metadata = described_class.new
expect(model_metadata.to_params).to eq({
provider: :amazon_q,
name: :amazon_q,
role_arn: "role-arn"
})
end
end
context 'when feature_setting is not self-hosted and Ai::AmazonQ is not connected' do
let(:self_hosted) { false }
before do
allow(::Ai::AmazonQ).to receive(:connected?).and_return(false)
end
it 'returns nil' do
model_metadata = described_class.new
expect(model_metadata.to_params).to be_nil
end
end
end
end
0% 加载中 .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册