# frozen_string_literal: true require "dotenv" require "openai" require_relative "writer" module JpTranslatorFromGpt class Translator SYSTEM_CONTENT = <<~TEXT You are the translator. Please return only the translated result and do not include extraneous information. Symbols, etc., should be output as is. TEXT def initialize # 環境変数の読み込み Dotenv.load @client = OpenAI::Client.new( access_token: ENV["OPENAI_API_KEY"], log_errors: true # 好み ) end # テキストを日本語に翻訳し、結果をファイルに書き込む # # @param [String] text 翻訳するテキスト # @return [void] def translate_to_jp(text) response = chat_to_api(text) input_tokens = dig_used_tokens(response, "input") output_tokens = dig_used_tokens(response, "output") Writer.write_translated_text(response) Writer.write_used_tokens(input_tokens, output_tokens) Writer.write_total_cost(input_tokens, output_tokens) response["choices"][0]["message"]["content"] end private # OpenAI APIにテキストを送信し、翻訳結果を取得する # # @param [String] text 翻訳するテキスト # @return [Hash] OpenAI APIからのレスポンス def chat_to_api(text) @client.chat( parameters: { model: ENV["OPENAI_MODEL"] || "gpt-4o-mini", messages: [ { role: "system", content: SYSTEM_CONTENT }, { role: "user", content: "please translate this to Japanese: #{text}" } ] } ) end # レスポンスから使用したトークン数を取得する # # @param [Hash] response OpenAI APIからのレスポンス # @param [String] token_type トークンの種類 (input or output) # @return [Integer] 使用したトークン数 def dig_used_tokens(response, token_type) if token_type == "input" response["usage"]["prompt_tokens"] elsif token_type == "output" response["usage"]["completion_tokens"] end end end end