# frozen_string_literal: true module DiscourseAi module AiBot class AnthropicBot < Bot def self.can_reply_as?(bot_user) bot_user.id == DiscourseAi::AiBot::EntryPoint::CLAUDE_V2_ID end def bot_prompt_with_topic_context(post) super(post).join("\n\n") + "\n\nAssistant:" end def prompt_limit 50_000 # https://console.anthropic.com/docs/prompt-design#what-is-a-prompt end def title_prompt(post) super(post).join("\n\n") + "\n\nAssistant:" end def get_delta(partial, context) partial[:completion] end private def populate_functions(partial, function) # nothing to do here, no proper function support # needs to be simulated for Claude but model is too # hard to steer for now end def build_message(poster_username, content, system: false, function: nil) role = poster_username == bot_user.username ? "Assistant" : "Human" "#{role}: #{content}" end def model_for "claude-2" end def get_updated_title(prompt) DiscourseAi::Inference::AnthropicCompletions.perform!( prompt, model_for, temperature: 0.7, max_tokens: 40, ).dig(:completion) end def submit_prompt(prompt, prefer_low_cost: false, &blk) DiscourseAi::Inference::AnthropicCompletions.perform!( prompt, model_for, temperature: 0.4, max_tokens: 3000, &blk ) end def tokenize(text) DiscourseAi::Tokenizer::AnthropicTokenizer.tokenize(text) end end end end