2024-11-19 17:28:09 +11:00
# 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 " ,
2025-04-01 02:39:07 +11:00
messages : [ type : :user , id : " user1 " , content : [ " hello " , { upload_id : upload100x100 . id } ] ] ,
2024-11-19 17:28:09 +11:00
)
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 (
2025-04-01 02:39:07 +11:00
[ { type : " text " , text : " user1: hello " } , { type : " image_url " , image_url : { url : image } } ] ,
2024-11-19 17:28:09 +11:00
)
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, \n and you will generate five attention-grabbing titles. Please keep the title concise and under 20 words, \n and 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