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
|