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

Commit f725ad6

Browse files
committed
Merge branch 'main' into costs-metric
2 parents 02c2508 + e2b0287 commit f725ad6

File tree

9 files changed

+41
-8
lines changed

9 files changed

+41
-8
lines changed

app/controllers/discourse_ai/admin/ai_llms_controller.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -157,6 +157,7 @@ def ai_llm_params(updating: nil)
157157
:provider,
158158
:tokenizer,
159159
:max_prompt_tokens,
160+
:max_output_tokens,
160161
:api_key,
161162
:enabled_chat_bot,
162163
:vision_enabled,

app/models/llm_model.rb

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ class LlmModel < ActiveRecord::Base
1616
validates :input_cost,
1717
:cached_input_cost,
1818
:output_cost,
19+
:max_output_tokens,
1920
numericality: {
2021
greater_than_or_equal_to: 0,
2122
},
@@ -193,4 +194,5 @@ def required_provider_params
193194
# input_cost :float
194195
# cached_input_cost :float
195196
# output_cost :float
197+
# max_output_tokens :integer
196198
#

app/serializers/llm_model_serializer.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ class LlmModelSerializer < ApplicationSerializer
1111
:name,
1212
:provider,
1313
:max_prompt_tokens,
14+
:max_output_tokens,
1415
:tokenizer,
1516
:api_key,
1617
:url,

assets/javascripts/discourse/admin/models/ai-llm.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ export default class AiLlm extends RestModel {
1010
"provider",
1111
"tokenizer",
1212
"max_prompt_tokens",
13+
"max_output_tokens",
1314
"url",
1415
"api_key",
1516
"enabled_chat_bot",

assets/javascripts/discourse/components/ai-llm-editor-form.gjs

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ export default class AiLlmEditorForm extends Component {
4040

4141
return {
4242
max_prompt_tokens: modelInfo.tokens,
43+
max_output_tokens: modelInfo.max_output_tokens,
4344
tokenizer: info.tokenizer,
4445
url: modelInfo.endpoint || info.endpoint,
4546
display_name: modelInfo.display_name,
@@ -56,6 +57,7 @@ export default class AiLlmEditorForm extends Component {
5657

5758
return {
5859
max_prompt_tokens: model.max_prompt_tokens,
60+
max_output_tokens: model.max_output_tokens,
5961
api_key: model.api_key,
6062
tokenizer: model.tokenizer,
6163
url: model.url,
@@ -185,8 +187,18 @@ export default class AiLlmEditorForm extends Component {
185187
this.isSaving = true;
186188
const isNew = this.args.model.isNew;
187189

190+
const updatedData = {
191+
...data,
192+
};
193+
194+
// If max_prompt_tokens input is cleared,
195+
// we want the db to store null
196+
if (!data.max_output_tokens) {
197+
updatedData.max_output_tokens = null;
198+
}
199+
188200
try {
189-
await this.args.model.save(data);
201+
await this.args.model.save(updatedData);
190202

191203
if (isNew) {
192204
this.args.llms.addObject(this.args.model);
@@ -397,7 +409,6 @@ export default class AiLlmEditorForm extends Component {
397409
as |field|
398410
>
399411
<field.Input @type="number" step="any" min="0" lang="en" />
400-
401412
</inputGroup.Field>
402413

403414
<inputGroup.Field
@@ -408,7 +419,6 @@ export default class AiLlmEditorForm extends Component {
408419
as |field|
409420
>
410421
<field.Input @type="number" step="any" min="0" lang="en" />
411-
412422
</inputGroup.Field>
413423

414424
<inputGroup.Field
@@ -422,6 +432,16 @@ export default class AiLlmEditorForm extends Component {
422432
</inputGroup.Field>
423433
</form.InputGroup>
424434

435+
<form.Field
436+
@name="max_output_tokens"
437+
@title={{i18n "discourse_ai.llms.max_output_tokens"}}
438+
@tooltip={{i18n "discourse_ai.llms.hints.max_output_tokens"}}
439+
@format="large"
440+
as |field|
441+
>
442+
<field.Input @type="number" step="any" min="0" lang="en" />
443+
</form.Field>
444+
425445
<form.Field
426446
@name="vision_enabled"
427447
@title={{i18n "discourse_ai.llms.vision_enabled"}}

config/locales/client.en.yml

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -399,7 +399,8 @@ en:
399399
name: "Model id"
400400
provider: "Provider"
401401
tokenizer: "Tokenizer"
402-
max_prompt_tokens: "Number of tokens for the prompt"
402+
max_prompt_tokens: "Context window"
403+
max_output_tokens: "Max output tokens"
403404
url: "URL of the service hosting the model"
404405
api_key: "API Key of the service hosting the model"
405406
enabled_chat_bot: "Allow AI bot selector"
@@ -486,7 +487,8 @@ en:
486487
failure: "Trying to contact the model returned this error: %{error}"
487488

488489
hints:
489-
max_prompt_tokens: "Max numbers of tokens for the prompt. As a rule of thumb, this should be 50% of the model's context window."
490+
max_prompt_tokens: "The maximum number of tokens the model can process in a single request"
491+
max_output_tokens: "The maximum number of tokens the model can generate in a single request"
490492
display_name: "The name used to reference this model across your site's interface."
491493
name: "We include this in the API call to specify which model we'll use"
492494
vision_enabled: "If enabled, the AI will attempt to understand images. It depends on the model being used supporting vision. Supported by latest models from Anthropic, Google, and OpenAI."
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
# frozen_string_literal: true
2+
3+
class AddMaxOutputTokensToLlmModel < ActiveRecord::Migration[7.2]
4+
def change
5+
add_column :llm_models, :max_output_tokens, :integer
6+
end
7+
end

spec/system/ai_helper/ai_composer_helper_spec.rb

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -36,9 +36,6 @@
3636
"I like to eat pie. It is a very good dessert. Some people are wasteful by throwing pie at others but I do not do that. I always eat the pie.",
3737
)
3838
end
39-
fab!(:post_2) do
40-
Fabricate(:post, topic: topic, raw: "La lluvia en España se queda principalmente en el avión.")
41-
end
4239

4340
def trigger_composer_helper(content)
4441
visit("/latest")

spec/system/llms/ai_llm_spec.rb

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@
5353
form.field("max_prompt_tokens").fill_in(8000)
5454
form.field("provider").select("vllm")
5555
form.field("tokenizer").select("DiscourseAi::Tokenizer::Llama3Tokenizer")
56+
form.field("max_output_tokens").fill_in(2000)
5657
form.field("vision_enabled").toggle
5758
form.field("enabled_chat_bot").toggle
5859
form.submit
@@ -67,6 +68,7 @@
6768
expect(llm.tokenizer).to eq("DiscourseAi::Tokenizer::Llama3Tokenizer")
6869
expect(llm.max_prompt_tokens.to_i).to eq(8000)
6970
expect(llm.provider).to eq("vllm")
71+
expect(llm.max_output_tokens.to_i).to eq(2000)
7072
expect(llm.vision_enabled).to eq(true)
7173
expect(llm.user_id).not_to be_nil
7274
end

0 commit comments

Comments
 (0)