2023-11-27 07:33:31 -05:00
# frozen_string_literal: true
RSpec . describe DiscourseAi :: AiHelper :: Assistant do
2024-03-05 10:48:28 -05:00
fab! ( :user )
2024-04-22 12:55:10 -04:00
fab! ( :empty_locale_user ) { Fabricate ( :user , locale : " " ) }
2023-11-27 07:33:31 -05:00
let ( :prompt ) { CompletionPrompt . find_by ( id : mode ) }
2024-06-19 17:01:35 -04:00
before { assign_fake_provider_to ( :ai_helper_model ) }
2024-01-29 14:04:25 -05:00
2023-11-27 07:33:31 -05:00
let ( :english_text ) { << ~ STRING }
To perfect his horror , Caesar , surrounded at the base of the statue by the impatient daggers of his friends ,
discovers among the faces and blades that of Marcus Brutus , his protege , perhaps his son , and he no longer
defends himself , but instead exclaims : 'You too, my son!' Shakespeare and Quevedo capture the pathetic cry .
STRING
2024-02-27 14:31:51 -05:00
describe ( " # custom_locale_instructions " ) do
it " Properly generates the per locale system instruction " do
SiteSetting . default_locale = " ko "
2024-07-04 11:23:37 -04:00
expect ( subject . custom_locale_instructions ( user , false ) ) . to eq (
2024-02-27 14:31:51 -05:00
" It is imperative that you write your answer in Korean (한국어), you are interacting with a Korean (한국어) speaking user. Leave tag names in English. " ,
)
SiteSetting . allow_user_locale = true
user . update! ( locale : " he " )
2024-07-04 11:23:37 -04:00
expect ( subject . custom_locale_instructions ( user , false ) ) . to eq (
2024-02-27 14:31:51 -05:00
" It is imperative that you write your answer in Hebrew (עברית), you are interacting with a Hebrew (עברית) speaking user. Leave tag names in English. " ,
)
end
2024-07-04 11:23:37 -04:00
it " returns sytstem instructions using Site locale if force_default_locale is true " do
SiteSetting . default_locale = " ko "
SiteSetting . allow_user_locale = true
user . update! ( locale : " he " )
expect ( subject . custom_locale_instructions ( user , true ) ) . to eq (
" It is imperative that you write your answer in Korean (한국어), you are interacting with a Korean (한국어) speaking user. Leave tag names in English. " ,
)
end
2024-02-27 14:31:51 -05:00
end
2024-01-02 14:24:16 -05:00
describe ( " # available_prompts " ) do
2024-02-16 13:57:14 -05:00
before do
SiteSetting . ai_helper_illustrate_post_model = " disabled "
2024-02-18 23:21:55 -05:00
DiscourseAi :: AiHelper :: Assistant . clear_prompt_cache!
2024-01-02 14:24:16 -05:00
end
2024-02-16 13:57:14 -05:00
it " returns all available prompts " do
2024-07-04 11:23:37 -04:00
prompts = subject . available_prompts ( user )
2024-02-16 13:57:14 -05:00
2024-11-24 16:33:54 -05:00
expect ( prompts . length ) . to eq ( 7 )
2024-02-16 13:57:14 -05:00
expect ( prompts . map { | p | p [ :name ] } ) . to contain_exactly (
" translate " ,
" generate_titles " ,
" proofread " ,
" markdown_table " ,
" custom_prompt " ,
" explain " ,
2024-11-24 16:33:54 -05:00
" detect_text_locale " ,
2024-02-16 13:57:14 -05:00
)
2024-01-02 14:24:16 -05:00
end
2024-11-27 19:14:21 -05:00
it " returns all prompts to be shown in the composer " do
prompts = subject . available_prompts ( user )
filtered_prompts = prompts . select { | prompt | prompt [ :location ] . include? ( " composer " ) }
expect ( filtered_prompts . length ) . to eq ( 5 )
expect ( filtered_prompts . map { | p | p [ :name ] } ) . to contain_exactly (
" translate " ,
" generate_titles " ,
" proofread " ,
" markdown_table " ,
" custom_prompt " ,
)
end
it " returns all prompts to be shown in the post menu " do
prompts = subject . available_prompts ( user )
filtered_prompts = prompts . select { | prompt | prompt [ :location ] . include? ( " post " ) }
expect ( filtered_prompts . length ) . to eq ( 4 )
expect ( filtered_prompts . map { | p | p [ :name ] } ) . to contain_exactly (
" translate " ,
" explain " ,
" proofread " ,
" custom_prompt " ,
)
end
2024-07-05 05:16:09 -04:00
it " does not raise an error when effective_locale does not exactly match keys in LocaleSiteSetting " do
SiteSetting . default_locale = " zh_CN "
expect { subject . available_prompts ( user ) } . not_to raise_error
end
2024-01-05 12:03:23 -05:00
context " when illustrate post model is enabled " do
2024-02-16 13:57:14 -05:00
before do
SiteSetting . ai_helper_illustrate_post_model = " stable_diffusion_xl "
2024-02-18 23:21:55 -05:00
DiscourseAi :: AiHelper :: Assistant . clear_prompt_cache!
2024-02-16 13:57:14 -05:00
end
2024-01-02 14:24:16 -05:00
it " returns the illustrate_post prompt in the list of all prompts " do
2024-07-04 11:23:37 -04:00
prompts = subject . available_prompts ( user )
2024-01-02 14:24:16 -05:00
2024-11-24 16:33:54 -05:00
expect ( prompts . length ) . to eq ( 8 )
2024-01-02 14:24:16 -05:00
expect ( prompts . map { | p | p [ :name ] } ) . to contain_exactly (
" translate " ,
" generate_titles " ,
" proofread " ,
" markdown_table " ,
" custom_prompt " ,
" explain " ,
" illustrate_post " ,
2024-11-24 16:33:54 -05:00
" detect_text_locale " ,
2024-01-02 14:24:16 -05:00
)
end
end
end
2024-02-27 14:31:51 -05:00
describe ( " # localize_prompt! " ) do
2024-04-22 12:55:10 -04:00
before { SiteSetting . allow_user_locale = true }
2024-02-27 14:31:51 -05:00
it " is able to perform %LANGUAGE% replacements " do
prompt =
CompletionPrompt . new ( messages : { insts : " This is a %LANGUAGE% test " } ) . messages_with_input (
" test " ,
)
subject . localize_prompt! ( prompt , user )
expect ( prompt . messages [ 0 ] [ :content ] . strip ) . to eq ( " This is a English (US) test " )
end
2024-04-22 12:55:10 -04:00
it " handles users with empty string locales " do
prompt =
CompletionPrompt . new ( messages : { insts : " This is a %LANGUAGE% test " } ) . messages_with_input (
" test " ,
)
subject . localize_prompt! ( prompt , empty_locale_user )
expect ( prompt . messages [ 0 ] [ :content ] . strip ) . to eq ( " This is a English (US) test " )
end
2024-02-27 14:31:51 -05:00
end
2023-11-27 07:33:31 -05:00
describe " # generate_and_send_prompt " do
context " when using a prompt that returns text " do
let ( :mode ) { CompletionPrompt :: TRANSLATE }
let ( :text_to_translate ) { << ~ STRING }
Para que su horror sea perfecto , César , acosado al pie de la estatua por lo impacientes puñales de sus amigos ,
descubre entre las caras y los aceros la de Marco Bruto , su protegido , acaso su hijo ,
y ya no se defiende y exclama : ¡ Tú también , hijo mío! Shakespeare y Quevedo recogen el patético grito .
STRING
it " Sends the prompt to the LLM and returns the response " do
response =
2023-11-28 23:17:46 -05:00
DiscourseAi :: Completions :: Llm . with_prepared_responses ( [ english_text ] ) do
2023-11-27 07:33:31 -05:00
subject . generate_and_send_prompt ( prompt , text_to_translate , user )
end
expect ( response [ :suggestions ] ) . to contain_exactly ( english_text )
end
end
context " when using a prompt that returns a list " do
let ( :mode ) { CompletionPrompt :: GENERATE_TITLES }
let ( :titles ) do
2023-11-28 10:52:22 -05:00
" <item>The solitary horse</item><item>The horse etched in gold</item><item>A horse's infinite journey</item><item>A horse lost in time</item><item>A horse's last ride</item> "
2023-11-27 07:33:31 -05:00
end
it " returns an array with each title " do
2023-11-28 10:52:22 -05:00
expected = [
" The solitary horse " ,
" The horse etched in gold " ,
" A horse's infinite journey " ,
" A horse lost in time " ,
" A horse's last ride " ,
]
2023-11-27 07:33:31 -05:00
response =
2023-11-28 23:17:46 -05:00
DiscourseAi :: Completions :: Llm . with_prepared_responses ( [ titles ] ) do
2023-11-27 07:33:31 -05:00
subject . generate_and_send_prompt ( prompt , english_text , user )
end
expect ( response [ :suggestions ] ) . to contain_exactly ( * expected )
end
end
end
end