class Jeeves::CLI
def generate_commit_message(diff)
def generate_commit_message(diff) api_key = ENV['OPENROUTER_API_KEY'] if api_key.nil? || api_key.empty? puts "Error: OPENROUTER_API_KEY environment variable not set" exit 1 end model = ENV['GIT_COMMIT_MODEL'] || 'openai/gpt-4o-mini' prompt_file_path = get_prompt_file_path puts "Using prompt file: #{prompt_file_path}" prompt = File.read(prompt_file_path).gsub('{{DIFF}}', diff) uri = URI.parse('https://openrouter.ai/api/v1/chat/completions') http = Net::HTTP.new(uri.host, uri.port) http.use_ssl = true request = Net::HTTP::Post.new(uri.request_uri) request['Content-Type'] = 'application/json' request['Authorization'] = "Bearer #{api_key}" request['HTTP-Referer'] = 'https://github.com/jeeves-git-commit' # For reasoning models, use system message to enforce output format messages = if model.include?('gpt-5') || model.include?('o1') [ { role: 'system', content: 'You are a git commit message generator. Respond ONLY with the final commit message. Do not show your thinking or reasoning process.' }, { role: 'user', content: prompt } ] else [ { role: 'user', content: prompt } ] end request_body = { model: model, messages: messages, max_tokens: 1000, stop: ["END_COMMIT"] } # Remove any reasoning parameters that cause API errors # GPT-5 mini will put reasoning in the reasoning field regardless request.body = request_body.to_json begin response = http.request(request) if response.code == '200' result = JSON.parse(response.body) # Better error handling for API response structure if result['choices'] && result['choices'][0] && result['choices'][0]['message'] message = result['choices'][0]['message'] commit_message = message['content'] if commit_message && !commit_message.strip.empty? commit_message = commit_message.strip puts "Generated commit message:" puts "------------------------" puts commit_message puts "------------------------" return commit_message else puts "Error: API returned empty commit message" puts "This model (#{model}) may not be compatible with direct output." puts "Try using a different model with: export GIT_COMMIT_MODEL=\"openai/gpt-4o-mini\"" exit 1 end else puts "Error: Unexpected API response structure" puts "Full API response: #{response.body}" exit 1 end else puts "API Error (#{response.code}): #{response.body}" exit 1 end rescue => e puts "Error: #{e.message}" exit 1 end end