discourse-ai/lib/modules/ai_helper/open_ai_prompt.rb

93 lines
3.0 KiB
Ruby
Raw Normal View History

# frozen_string_literal: true
module DiscourseAi
module AiHelper
class OpenAiPrompt
TRANSLATE = "translate"
GENERATE_TITLES = "generate_titles"
PROOFREAD = "proofread"
VALID_TYPES = [TRANSLATE, GENERATE_TITLES, PROOFREAD]
def get_prompt_for(prompt_type)
case prompt_type
when TRANSLATE
translate_prompt
when GENERATE_TITLES
generate_titles_prompt
when PROOFREAD
proofread_prompt
end
end
def generate_and_send_prompt(prompt_type, text)
result = {}
prompt = [
{ role: "system", content: get_prompt_for(prompt_type) },
{ role: "user", content: text },
]
result[:suggestions] = DiscourseAi::Inference::OpenAiCompletions
.perform!(prompt)
.dig(:choices)
.to_a
.flat_map { |choice| parse_content(prompt_type, choice.dig(:message, :content).to_s) }
.compact_blank
result[:diff] = generate_diff(text, result[:suggestions].first) if proofreading?(
prompt_type,
)
result
end
private
def proofreading?(prompt_type)
prompt_type == PROOFREAD
end
def generate_diff(text, suggestion)
cooked_text = PrettyText.cook(text)
cooked_suggestion = PrettyText.cook(suggestion)
DiscourseDiff.new(cooked_text, suggestion).inline_html
end
def parse_content(type, content)
return "" if content.blank?
return content.strip if type != GENERATE_TITLES
content.gsub("\"", "").gsub(/\d./, "").split("\n").map(&:strip)
end
def translate_prompt
<<~STRING
I want you to act as an English translator, spelling corrector and improver. I will speak to you
in any language and you will detect the language, translate it and answer in the corrected and
improved version of my text, in English. I want you to replace my simplified A0-level words and
sentences with more beautiful and elegant, upper level English words and sentences.
Keep the meaning same, but make them more literary. I want you to only reply the correction,
the improvements and nothing else, do not write explanations.
STRING
end
def generate_titles_prompt
<<~STRING
I want you to act as a title generator for written pieces. I will provide you with a text,
and you will generate five attention-grabbing titles. Please keep the title concise and under 20 words,
and ensure that the meaning is maintained. Replies will utilize the language type of the topic.
STRING
end
def proofread_prompt
<<~STRING
I want you act as a proofreader. I will provide you with a text and I want you to review them for any spelling,
grammar, or punctuation errors. Once you have finished reviewing the text, provide me with any necessary
corrections or suggestions for improve the text.
STRING
end
end
end
end