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

Commit 5a58e48

Browse files
committed
support for seeded models
1 parent 957887f commit 5a58e48

File tree

8 files changed

+68
-8
lines changed

8 files changed

+68
-8
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: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -173,6 +173,15 @@ def strategy_version
173173
strategy.version
174174
end
175175

176+
def api_key
177+
if seeded?
178+
env_key = "DISCOURSE_AI_SEEDED_EMBEDDING_API_KEY"
179+
ENV[env_key] || self[:api_key]
180+
else
181+
self[:api_key]
182+
end
183+
end
184+
176185
private
177186

178187
def strategy
@@ -215,6 +224,7 @@ def gemini_client
215224
# tokenizer_class :string not null
216225
# url :string not null
217226
# api_key :string
227+
# seeded :boolean default(FALSE), not null
218228
# provider_params :jsonb
219229
# created_at :datetime not null
220230
# updated_at :datetime not null

app/serializers/ai_embedding_definition_serializer.rb

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,19 @@ class AiEmbeddingDefinitionSerializer < ApplicationSerializer
1111
:provider,
1212
:url,
1313
:api_key,
14+
:seeded,
1415
:tokenizer_class,
1516
:provider_params
17+
18+
def api_key
19+
object.seeded? ? "********" : object.api_key
20+
end
21+
22+
def url
23+
object.seeded? ? "********" : object.url
24+
end
25+
26+
def provider
27+
object.seeded? ? "CDCK" : object.provider
28+
end
1629
end

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

Lines changed: 23 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ 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

1112
export default class AiEmbeddingsListEditor extends Component {
@@ -72,12 +73,28 @@ export default class AiEmbeddingsListEditor extends Component {
7273
}}
7374
</td>
7475
<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-
/>
76+
{{#if embedding.seeded}}
77+
<DTooltip
78+
class="ai-embeddings-list__edit-disabled-tooltip"
79+
>
80+
<:trigger>
81+
<DButton
82+
class="btn btn-default btn-small disabled"
83+
@label="discourse_ai.embeddings.edit"
84+
/>
85+
</:trigger>
86+
<:content>
87+
{{i18n "discourse_ai.embeddings.seeded_warning"}}
88+
</:content>
89+
</DTooltip>
90+
{{else}}
91+
<DButton
92+
class="btn btn-default btn-small ai-embeddings-list__edit-button"
93+
@label="discourse_ai.embeddings.edit"
94+
@route="adminPlugins.show.discourse-ai-embeddings.edit"
95+
@routeModels={{embedding.id}}
96+
/>
97+
{{/if}}
8198
</td>
8299
</tr>
83100
{{/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."

db/migrate/20241217164540_create_embedding_definitions.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ def change
1111
t.string :tokenizer_class, null: false
1212
t.string :url, null: false
1313
t.string :api_key
14+
t.boolean :seeded, null: false, default: false
1415
t.jsonb :provider_params
1516
t.timestamps
1617
end

db/migrate/20250110114305_embedding_config_data_migration.rb

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -61,18 +61,22 @@ def creds_for(provider)
6161
}
6262
# TEI
6363
elsif provider == "hugging_face"
64+
seeded = false
6465
endpoint = fetch_setting("ai_hugging_face_tei_endpoint")
6566

6667
if endpoint.blank?
6768
endpoint = fetch_setting("ai_hugging_face_tei_endpoint_srv")
68-
endpoint = "srv://#{endpoint}" if endpoint.present?
69+
if endpoint.present?
70+
endpoint = "srv://#{endpoint}"
71+
seeded = true
72+
end
6973
end
7074

7175
api_key = fetch_setting("ai_hugging_face_tei_api_key")
7276

7377
return if endpoint.blank? || api_key.blank?
7478

75-
{ url: endpoint, api_key: api_key }
79+
{ url: endpoint, api_key: api_key, seeded: seeded }
7680
# Gemini
7781
elsif provider == "google"
7882
api_key = fetch_setting("ai_gemini_api_key")

0 commit comments

Comments
 (0)