Class: Bddgenx::IA::GeminiCliente
- Inherits:
-
Object
- Object
- Bddgenx::IA::GeminiCliente
- Defined in:
- lib/bddgenx/ia/gemini_cliente.rb
Overview
Cliente para interação com a API Gemini do Google para geração de conteúdo, aqui usado para criar cenários BDD no formato Gherkin.
Constant Summary collapse
- GEMINI_API_URL =
'https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash:generateContent'.freeze
Class Method Summary collapse
-
.detecta_idioma_arquivo(caminho_arquivo) ⇒ String
Detecta o idioma do arquivo de feature pela linha “# language:”.
-
.gerar_cenarios(historia, idioma = 'pt') ⇒ String?
Gera cenários BDD baseados em uma história, solicitando à API Gemini o retorno no formato Gherkin com palavras-chave no idioma desejado.
Class Method Details
.detecta_idioma_arquivo(caminho_arquivo) ⇒ String
Detecta o idioma do arquivo de feature pela linha “# language:”.
122 123 124 125 126 127 128 129 130 131 132 |
# File 'lib/bddgenx/ia/gemini_cliente.rb', line 122 def self.detecta_idioma_arquivo(caminho_arquivo) return 'pt' unless File.exist?(caminho_arquivo) File.foreach(caminho_arquivo) do |linha| if linha =~ /^#\s*language:\s*(\w{2})/i return $1.downcase end end 'pt' # idioma padrão caso não encontre end |
.gerar_cenarios(historia, idioma = 'pt') ⇒ String?
Gera cenários BDD baseados em uma história, solicitando à API Gemini o retorno no formato Gherkin com palavras-chave no idioma desejado.
20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 |
# File 'lib/bddgenx/ia/gemini_cliente.rb', line 20 def self.gerar_cenarios(historia, idioma = 'pt') api_key = Bddgenx.configuration.gemini_api_key # para Gemini keywords_pt = { feature: "Funcionalidade", scenario: "Cenário", scenario_outline: "Esquema do Cenário", examples: "Exemplos", given: "Dado", when: "Quando", then: "Então", and: "E" } keywords_en = { feature: "Feature", scenario: "Scenario", scenario_outline: "Scenario Outline", examples: "Examples", given: "Given", when: "When", then: "Then", and: "And" } keywords = idioma == 'en' ? keywords_en : keywords_pt # Prompt base que instrui a IA a gerar cenários Gherkin no idioma indicado prompt_base = <<~PROMPT Gere cenários BDD no formato Gherkin, usando as palavras-chave de estrutura no idioma "#{idioma}": Feature: #{keywords[:feature]} Scenario: #{keywords[:scenario]} Scenario Outline: #{keywords[:scenario_outline]} Examples: #{keywords[:examples]} Given: #{keywords[:given]} When: #{keywords[:when]} Then: #{keywords[:then]} And: #{keywords[:and]} Atenção: Os textos e descrições dos cenários e passos devem ser escritos em português, mesmo que as palavras-chave estejam em inglês. História: #{historia} PROMPT unless api_key warn "❌ API Key do Gemini não encontrada no .env (GEMINI_API_KEY)" return nil end uri = URI("#{GEMINI_API_URL}?key=#{api_key}") # Estrutura do corpo da requisição para a API Gemini request_body = { contents: [ { role: "user", parts: [{ text: prompt_base }] } ] } # Executa requisição POST para a API Gemini response = Net::HTTP.post(uri, request_body.to_json, { "Content-Type" => "application/json" }) if response.is_a?(Net::HTTPSuccess) json = JSON.parse(response.body) unless json["candidates"]&.is_a?(Array) && json["candidates"].any? warn "❌ Resposta da IA sem candidatos válidos:" warn JSON.pretty_generate(json) return nil end texto_ia = json["candidates"].first.dig("content", "parts", 0, "text") if texto_ia # Limpeza e sanitização do texto para manter padrão Gherkin texto_limpo = Bddgenx::GherkinCleaner.limpar(texto_ia) Utils::StepCleaner.remover_steps_duplicados(texto_ia, idioma) # Ajuste da diretiva de idioma na saída gerada texto_limpo.sub!(/^# language: .*/, "# language: #{idioma}") texto_limpo.prepend("# language: #{idioma}\n") unless texto_limpo.start_with?("# language:") return texto_limpo else warn "❌ Resposta da IA sem conteúdo de texto" warn JSON.pretty_generate(json) return nil end else warn "❌ Erro ao chamar Gemini: #{response.code} - #{response.body}" return nil end end |