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 =
ENV['GEMINI_API_URL']
Class Method Summary collapse
-
.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
.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 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 |
# 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, utilizando as palavras-chave estruturais 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]} Instruções: - Todos os textos dos passos devem ser escritos em **português**. - Use as palavras-chave Gherkin no idioma especificado ("#{idioma}"). - Gere **vários cenários**, incluindo positivos e negativos. - Use `Scenario Outline` e `Examples` sempre que houver valores variáveis. - Mantenha os parâmetros como `<email>`, `<senha>` e outros entre colchetes angulares, exatamente como aparecem. - Se a história fornecer contexto (ex: `[CONTEXT]` ou "Dado que..."), utilize-o como base para os cenários. - Se não houver contexto explícito, **crie um coerente** baseado na história. - A primeira linha do resultado deve conter obrigatoriamente `# language: #{idioma}`. - Evite passos vagos ou genéricos. Use ações claras e específicas. - Gere apenas o conteúdo da feature, sem explicações adicionais. História fornecida: #{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 = Utils.limpar(texto_ia) Utils.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:") # Garante diretiva de idioma feature_text = Utils.limpar(texto_ia) feature_text.sub!(/^# language: .*/, "") # remove qualquer # language: existente feature_text.prepend("# language: #{idioma}\n") # insere a correta return texto_limpo else warn I18n.t('errors.ia_no_content') warn JSON.pretty_generate(json) return nil end else warn I18n.t('errors.gemini_error', code: response.code, body: response.body) return nil end end |