Skip to content
This repository was archived by the owner on Jul 22, 2025. It is now read-only.

Commit 3f6fe30

Browse files
committed
support for seeded models
1 parent a562a5e commit 3f6fe30

File tree

7 files changed

+73
-6
lines changed

7 files changed

+73
-6
lines changed

app/controllers/discourse_ai/admin/ai_embeddings_controller.rb

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,12 @@ def create
4949
def update
5050
embedding_def = EmbeddingDefinition.find(params[:id])
5151

52+
if embedding_def.seeded?
53+
return(
54+
render_json_error(I18n.t("discourse_ai.embeddings.cannot_edit_builtin"), status: 403)
55+
)
56+
end
57+
5258
if embedding_def.update(ai_embeddings_params.except(:dimensions))
5359
render json: AiEmbeddingDefinitionSerializer.new(embedding_def)
5460
else
@@ -59,6 +65,12 @@ def update
5965
def destroy
6066
embedding_def = EmbeddingDefinition.find(params[:id])
6167

68+
if embedding_def.seeded?
69+
return(
70+
render_json_error(I18n.t("discourse_ai.embeddings.cannot_edit_builtin"), status: 403)
71+
)
72+
end
73+
6274
if embedding_def.id == SiteSetting.ai_embeddings_selected_model.to_i
6375
return render_json_error(I18n.t("discourse_ai.embeddings.delete_failed"), status: 409)
6476
end

app/models/embedding_definition.rb

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -173,6 +173,19 @@ def strategy_version
173173
strategy.version
174174
end
175175

176+
def seeded?
177+
id.present? && id < 0
178+
end
179+
180+
def api_key
181+
if seeded?
182+
env_key = "DISCOURSE_AI_SEEDED_EMBEDDING_API_KEY"
183+
ENV[env_key] || self[:api_key]
184+
else
185+
self[:api_key]
186+
end
187+
end
188+
176189
private
177190

178191
def strategy

app/serializers/ai_embedding_definition_serializer.rb

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,4 +13,16 @@ class AiEmbeddingDefinitionSerializer < ApplicationSerializer
1313
:api_key,
1414
:tokenizer_class,
1515
:provider_params
16+
17+
def api_key
18+
object.seeded? ? "********" : object.api_key
19+
end
20+
21+
def url
22+
object.seeded? ? "********" : object.url
23+
end
24+
25+
def provider
26+
object.seeded? ? "CDCK" : object.provider
27+
end
1628
end

assets/javascripts/discourse/components/ai-embedding-editor.gjs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,10 @@ export default class AiEmbeddingEditor extends Component {
7272
return !this.selectedPreset && this.args.model.isNew;
7373
}
7474

75+
get seeded() {
76+
return this.args.model.id < 0;
77+
}
78+
7579
@computed("editingModel.provider")
7680
get metaProviderParams() {
7781
return (

assets/javascripts/discourse/components/ai-embeddings-list-editor.gjs

Lines changed: 29 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,15 @@ import DButton from "discourse/components/d-button";
66
import DPageSubheader from "discourse/components/d-page-subheader";
77
import { i18n } from "discourse-i18n";
88
import AdminConfigAreaEmptyList from "admin/components/admin-config-area-empty-list";
9+
import DTooltip from "float-kit/components/d-tooltip";
910
import AiEmbeddingEditor from "./ai-embedding-editor";
1011

12+
function isPreseeded(embedding) {
13+
if (embedding.id < 0) {
14+
return true;
15+
}
16+
}
17+
1118
export default class AiEmbeddingsListEditor extends Component {
1219
@service adminPluginNavManager;
1320

@@ -72,12 +79,28 @@ export default class AiEmbeddingsListEditor extends Component {
7279
}}
7380
</td>
7481
<td class="d-admin-row__controls">
75-
<DButton
76-
class="btn btn-default btn-small ai-embeddings-list__edit-button"
77-
@label="discourse_ai.embeddings.edit"
78-
@route="adminPlugins.show.discourse-ai-embeddings.edit"
79-
@routeModels={{embedding.id}}
80-
/>
82+
{{#if (isPreseeded embedding)}}
83+
<DTooltip
84+
class="ai-embeddings-list__edit-disabled-tooltip"
85+
>
86+
<:trigger>
87+
<DButton
88+
class="btn btn-default btn-small disabled"
89+
@label="discourse_ai.embeddings.edit"
90+
/>
91+
</:trigger>
92+
<:content>
93+
{{i18n "discourse_ai.embeddings.seeded_warning"}}
94+
</:content>
95+
</DTooltip>
96+
{{else}}
97+
<DButton
98+
class="btn btn-default btn-small ai-embeddings-list__edit-button"
99+
@label="discourse_ai.embeddings.edit"
100+
@route="adminPlugins.show.discourse-ai-embeddings.edit"
101+
@routeModels={{embedding.id}}
102+
/>
103+
{{/if}}
81104
</td>
82105
</tr>
83106
{{/each}}

config/locales/client.en.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -514,6 +514,7 @@ en:
514514
presets: "Select a preset..."
515515
configure_manually: "Configure manually"
516516
edit: "Edit"
517+
seeded_warning: "This is pre-configured on your site and cannot be edited."
517518
tests:
518519
title: "Run test"
519520
running: "Running test..."
@@ -539,6 +540,7 @@ en:
539540
open_ai: "OpenAI"
540541
google: "Google"
541542
cloudflare: "Cloudflare"
543+
CDCK: "CDCK"
542544
provider_fields:
543545
model_name: "Model name"
544546

config/locales/server.en.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -431,6 +431,7 @@ en:
431431

432432
embeddings:
433433
delete_failed: "This model is currently in use. Update the `ai embeddings selected model` first."
434+
cannot_edit_builtin: "You can't edit a built-in model."
434435
configuration:
435436
disable_embeddings: "You have to disable 'ai embeddings enabled' first."
436437
choose_model: "Set 'ai embeddings selected model' first."

0 commit comments

Comments
 (0)