mirror of
https://github.com/discourse/discourse-ai.git
synced 2025-02-06 11:38:13 +00:00
755b63f31f
Adds support for mistral models (pixtral and mistral large now have presets) Also corrects token accounting in AWS bedrock models
82 lines
2.6 KiB
Ruby
82 lines
2.6 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
require "rails_helper"
|
|
require_relative "dialect_context"
|
|
|
|
RSpec.describe DiscourseAi::Completions::Dialects::Mistral do
|
|
fab!(:model) { Fabricate(:mistral_model) }
|
|
let(:context) { DialectContext.new(described_class, model) }
|
|
let(:image100x100) { plugin_file_from_fixtures("100x100.jpg") }
|
|
let(:upload100x100) do
|
|
UploadCreator.new(image100x100, "image.jpg").create_for(Discourse.system_user.id)
|
|
end
|
|
|
|
it "does not include user names" do
|
|
prompt =
|
|
DiscourseAi::Completions::Prompt.new(
|
|
messages: [type: :user, content: "Hello, I am Bob", id: "bob"],
|
|
)
|
|
|
|
dialect = described_class.new(prompt, model)
|
|
|
|
# mistral has no support for name
|
|
expect(dialect.translate).to eq([{ role: "user", content: "bob: Hello, I am Bob" }])
|
|
end
|
|
|
|
it "can properly encode images" do
|
|
model.update!(vision_enabled: true)
|
|
|
|
prompt =
|
|
DiscourseAi::Completions::Prompt.new(
|
|
"You are image bot",
|
|
messages: [type: :user, id: "user1", content: "hello", upload_ids: [upload100x100.id]],
|
|
)
|
|
|
|
encoded = prompt.encoded_uploads(prompt.messages.last)
|
|
|
|
image = "data:image/jpeg;base64,#{encoded[0][:base64]}"
|
|
|
|
dialect = described_class.new(prompt, model)
|
|
|
|
content = dialect.translate[1][:content]
|
|
|
|
expect(content).to eq(
|
|
[{ type: "image_url", image_url: { url: image } }, { type: "text", text: "user1: hello" }],
|
|
)
|
|
end
|
|
|
|
it "can properly map tool calls to mistral format" do
|
|
result = [
|
|
{
|
|
role: "system",
|
|
content:
|
|
"I want you to act as a title generator for written pieces. I will provide you with a text,\nand you will generate five attention-grabbing titles. Please keep the title concise and under 20 words,\nand ensure that the meaning is maintained. Replies will utilize the language type of the topic.\n",
|
|
},
|
|
{ role: "user", content: "user1: This is a message by a user" },
|
|
{ role: "assistant", content: "I'm a previous bot reply, that's why there's no user" },
|
|
{ role: "user", content: "user1: This is a new message by a user" },
|
|
{
|
|
role: "assistant",
|
|
content: "",
|
|
tool_calls: [
|
|
{
|
|
type: "function",
|
|
function: {
|
|
arguments: "{\"location\":\"Sydney\",\"unit\":\"c\"}",
|
|
name: "get_weather",
|
|
},
|
|
id: "tool_id",
|
|
},
|
|
],
|
|
},
|
|
{
|
|
role: "tool",
|
|
tool_call_id: "tool_id",
|
|
content: "\"I'm a tool result\"",
|
|
name: "get_weather",
|
|
},
|
|
]
|
|
expect(context.multi_turn_scenario).to eq(result)
|
|
end
|
|
end
|