Skip to content

Commit

Permalink
system specs
Browse files Browse the repository at this point in the history
  • Loading branch information
romanrizzi committed Jan 14, 2025
1 parent 2ee7efd commit 3a845f6
Show file tree
Hide file tree
Showing 6 changed files with 113 additions and 17 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,9 @@ import DiscourseRoute from "discourse/routes/discourse";

export default class AdminPluginsShowDiscourseAiEmbeddingsEdit extends DiscourseRoute {
async model(params) {
const allEmbeddings = this.modelFor("adminPlugins.show.discourse-ai-embeddings");
const allEmbeddings = this.modelFor(
"adminPlugins.show.discourse-ai-embeddings"
);
const id = parseInt(params.id, 10);
const record = allEmbeddings.findBy("id", id);
record.provider_params = record.provider_params || {};
Expand Down
29 changes: 19 additions & 10 deletions assets/javascripts/discourse/components/ai-embedding-editor.gjs
Original file line number Diff line number Diff line change
Expand Up @@ -51,23 +51,30 @@ export default class AiEmbeddingEditor extends Component {
}

get presets() {
return this.args.embeddings.resultSetMeta.presets.map((preset) => {
const presets = this.args.embeddings.resultSetMeta.presets.map((preset) => {
return {
name: preset.display_name,
id: preset.preset_id,
};
});

presets.pushObject({
name: i18n("discourse_ai.embeddings.configure_manually"),
id: "manual",
});

return presets;
}

get showPresets() {
return !this.selectedPreset && this.args.model.isNew;
}

@computed("args.model.provider")
@computed("editingModel.provider")
get metaProviderParams() {
return (
this.args.embeddings.resultSetMeta.provider_params[
this.args?.model?.provider
this.editingModel?.provider
] || {}
);
}
Expand All @@ -82,10 +89,11 @@ export default class AiEmbeddingEditor extends Component {

@action
configurePreset() {
this.selectedPreset = this.args.embeddings.resultSetMeta.presets.findBy(
"preset_id",
this.presetId
);
this.selectedPreset =
this.args.embeddings.resultSetMeta.presets.findBy(
"preset_id",
this.presetId
) || {};

this.editingModel = this.store
.createRecord("ai-embedding", this.selectedPreset)
Expand Down Expand Up @@ -192,15 +200,15 @@ export default class AiEmbeddingEditor extends Component {
<ComboBox
@value={{this.presetId}}
@content={{this.presets}}
class="ai-tool-editor__presets"
class="ai-embedding-editor__presets"
/>
</div>

<div class="control-group ai-llm-editor__action_panel">
<DButton
@action={{this.configurePreset}}
@label="discourse_ai.tools.next.title"
class="ai-tool-editor__next"
class="ai-embedding-editor__next"
/>
</div>
{{else}}
Expand Down Expand Up @@ -253,7 +261,7 @@ export default class AiEmbeddingEditor extends Component {
<label>{{i18n "discourse_ai.embeddings.tokenizer"}}</label>
<ComboBox
@value={{this.editingModel.tokenizer_class}}
@content={{this.editingModel.resultSetMeta.tokenizers}}
@content={{@embeddings.resultSetMeta.tokenizers}}
@class="ai-embedding-editor__tokenizer"
/>
</div>
Expand Down Expand Up @@ -302,6 +310,7 @@ export default class AiEmbeddingEditor extends Component {
</label>
<Input
@type="text"
class="ai-embedding-editor-input ai-embedding-editor__{{field}}"
@value={{mut (get this.editingModel.provider_params field)}}
/>
</div>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import { service } from "@ember/service";
import DBreadcrumbsItem from "discourse/components/d-breadcrumbs-item";
import DButton from "discourse/components/d-button";
import DPageSubheader from "discourse/components/d-page-subheader";
import I18n, { i18n } from "discourse-i18n";
import { i18n } from "discourse-i18n";
import AdminConfigAreaEmptyList from "admin/components/admin-config-area-empty-list";
import AiEmbeddingEditor from "./ai-embedding-editor";

Expand Down Expand Up @@ -53,10 +53,7 @@ export default class AiEmbeddingsListEditor extends Component {
</thead>
<tbody>
{{#each @embeddings as |embedding|}}
<tr
data-embedding-name={{embedding.display_name}}
class="ai-embeddings-list__row d-admin-row__content"
>
<tr class="ai-embeddings-list__row d-admin-row__content">
<td class="d-admin-row__overview">
<div class="ai-embeddings-list__name">
<strong>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,4 +23,4 @@
display: flex;
align-items: center;
}
}
}
1 change: 1 addition & 0 deletions config/locales/client.en.yml
Original file line number Diff line number Diff line change
Expand Up @@ -512,6 +512,7 @@ en:
confirm_delete: Are you sure you want to remove this embedding configuration?
empty: "You haven't setup embeddings yet"
presets: "Select a preset..."
configure_manually: "Configure manually"
edit: "Edit"
tests:
title: "Run test"
Expand Down
87 changes: 87 additions & 0 deletions spec/system/embeddings/ai_embedding_definition_spec.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
# frozen_string_literal: true

RSpec.describe "Managing Embeddings configurations", type: :system, js: true do
fab!(:admin)
let(:page_header) { PageObjects::Components::DPageHeader.new }

before { sign_in(admin) }

it "correctly sets defaults" do
preset = "text-embedding-3-small"
api_key = "abcd"

visit "/admin/plugins/discourse-ai/ai-embeddings"

find(".ai-embeddings-list-editor__new-button").click()
select_kit = PageObjects::Components::SelectKit.new(".ai-embedding-editor__presets")
select_kit.expand
select_kit.select_row_by_value(preset)
find(".ai-embedding-editor__next").click
find("input.ai-embedding-editor__api-key").fill_in(with: api_key)
find(".ai-embedding-editor__save").click()

expect(page).to have_current_path("/admin/plugins/discourse-ai/ai-embeddings")

embedding_def = EmbeddingDefinition.order(:id).last
expect(embedding_def.api_key).to eq(api_key)

preset = EmbeddingDefinition.presets.find { |p| p[:preset_id] == preset }

expect(embedding_def.display_name).to eq(preset[:display_name])
expect(embedding_def.url).to eq(preset[:url])
expect(embedding_def.tokenizer_class).to eq(preset[:tokenizer_class])
expect(embedding_def.dimensions).to eq(preset[:dimensions])
expect(embedding_def.max_sequence_length).to eq(preset[:max_sequence_length])
expect(embedding_def.pg_function).to eq(preset[:pg_function])
expect(embedding_def.provider).to eq(preset[:provider])
expect(embedding_def.provider_params.symbolize_keys).to eq(preset[:provider_params])
end

it "supports manual config" do
api_key = "abcd"

visit "/admin/plugins/discourse-ai/ai-embeddings"

find(".ai-embeddings-list-editor__new-button").click()
select_kit = PageObjects::Components::SelectKit.new(".ai-embedding-editor__presets")
select_kit.expand
select_kit.select_row_by_value("manual")
find(".ai-embedding-editor__next").click

find("input.ai-embedding-editor__display-name").fill_in(with: "OpenAI's text-embedding-3-small")

select_kit = PageObjects::Components::SelectKit.new(".ai-embedding-editor__provider")
select_kit.expand
select_kit.select_row_by_value(EmbeddingDefinition::OPEN_AI)

find("input.ai-embedding-editor__url").fill_in(with: "https://api.openai.com/v1/embeddings")
find("input.ai-embedding-editor__api-key").fill_in(with: api_key)

select_kit = PageObjects::Components::SelectKit.new(".ai-embedding-editor__tokenizer")
select_kit.expand
select_kit.select_row_by_value("DiscourseAi::Tokenizer::OpenAiTokenizer")

find("input.ai-embedding-editor__dimensions").fill_in(with: 1536)
find("input.ai-embedding-editor__max_sequence_length").fill_in(with: 8191)

select_kit = PageObjects::Components::SelectKit.new(".ai-embedding-editor__distance_functions")
select_kit.expand
select_kit.select_row_by_value("<=>")
find(".ai-embedding-editor__save").click()

expect(page).to have_current_path("/admin/plugins/discourse-ai/ai-embeddings")

embedding_def = EmbeddingDefinition.order(:id).last
expect(embedding_def.api_key).to eq(api_key)

preset = EmbeddingDefinition.presets.find { |p| p[:preset_id] == "text-embedding-3-small" }

expect(embedding_def.display_name).to eq(preset[:display_name])
expect(embedding_def.url).to eq(preset[:url])
expect(embedding_def.tokenizer_class).to eq(preset[:tokenizer_class])
expect(embedding_def.dimensions).to eq(preset[:dimensions])
expect(embedding_def.max_sequence_length).to eq(preset[:max_sequence_length])
expect(embedding_def.pg_function).to eq(preset[:pg_function])
expect(embedding_def.provider).to eq(preset[:provider])
end
end

0 comments on commit 3a845f6

Please sign in to comment.