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 = " Gere cen\u00E1rios BDD no formato Gherkin, utilizando as palavras-chave estruturais no idioma \"\#{idioma}\":\n Feature: \#{keywords[:feature]}\n Scenario: \#{keywords[:scenario]}\n Scenario Outline: \#{keywords[:scenario_outline]}\n Examples: \#{keywords[:examples]}\n Given: \#{keywords[:given]}\n When: \#{keywords[:when]}\n Then: \#{keywords[:then]}\n And: \#{keywords[:and]}\n \n Instru\u00E7\u00F5es:\n - Todos os textos dos passos devem ser escritos em **portugu\u00EAs**.\n - Use as palavras-chave Gherkin no idioma especificado (\"\#{idioma}\").\n - Gere **v\u00E1rios cen\u00E1rios**, incluindo positivos e negativos.\n - Use `Scenario Outline` e `Examples` sempre que houver valores vari\u00E1veis.\n - Mantenha os par\u00E2metros como `<email>`, `<senha>` e outros entre colchetes angulares, exatamente como aparecem.\n - Se a hist\u00F3ria fornecer contexto (ex: `[CONTEXT]` ou \"Dado que...\"), utilize-o como base para os cen\u00E1rios.\n - Se n\u00E3o houver contexto expl\u00EDcito, **crie um coerente** baseado na hist\u00F3ria.\n - A primeira linha do resultado deve conter obrigatoriamente `# language: \#{idioma}`.\n - Evite passos vagos ou gen\u00E9ricos. Use a\u00E7\u00F5es claras e espec\u00EDficas.\n - Gere apenas o conte\u00FAdo da feature, sem explica\u00E7\u00F5es adicionais.\n \n Hist\u00F3ria fornecida:\n \#{historia}\n PROMPT\n\n\n\n unless api_key\n warn \"\u274C API Key do Gemini n\u00E3o encontrada no .env (GEMINI_API_KEY)\"\n return nil\n end\n\n uri = URI(\"\#{GEMINI_API_URL}?key=\#{api_key}\")\n\n # Estrutura do corpo da requisi\u00E7\u00E3o para a API Gemini\n request_body = {\n contents: [\n {\n role: \"user\",\n parts: [{ text: prompt_base }]\n }\n ]\n }\n\n # Executa requisi\u00E7\u00E3o POST para a API Gemini\n response = Net::HTTP.post(uri, request_body.to_json, { \"Content-Type\" => \"application/json\" })\n\n if response.is_a?(Net::HTTPSuccess)\n json = JSON.parse(response.body)\n\n unless json[\"candidates\"]&.is_a?(Array) && json[\"candidates\"].any?\n warn \"\u274C Resposta da IA sem candidatos v\u00E1lidos:\"\n warn JSON.pretty_generate(json)\n return nil\n end\n\n texto_ia = json[\"candidates\"].first.dig(\"content\", \"parts\", 0, \"text\")\n if texto_ia\n # Limpeza e sanitiza\u00E7\u00E3o do texto para manter padr\u00E3o Gherkin\n texto_limpo = Utils.limpar(texto_ia)\n Utils.remover_steps_duplicados(texto_ia, idioma)\n\n # Ajuste da diretiva de idioma na sa\u00EDda gerada\n texto_limpo.sub!(/^# language: .*/, \"# language: \#{idioma}\")\n texto_limpo.prepend(\"# language: \#{idioma}\\n\") unless texto_limpo.start_with?(\"# language:\")\n\n # Garante diretiva de idioma\n feature_text = Utils.limpar(texto_ia)\n feature_text.sub!(/^# language: .*/, \"\") # remove qualquer # language: existente\n feature_text.prepend(\"# language: \#{idioma}\\n\") # insere a correta\n\n return texto_limpo\n else\n warn I18n.t('errors.ia_no_content')\n warn JSON.pretty_generate(json)\n return nil\n end\n else\n warn I18n.t('errors.gemini_error', code: response.code, body: response.body)\n return nil\n end\nend\n" |