Method: Bddgenx::IA::MicrosoftCopilotCliente.gerar_cenarios

Defined in:
lib/bddgenx/ia/microsoft_copilot_cliente.rb

.gerar_cenarios(historia, idioma = 'pt') ⇒ String?

Gera cenários BDD baseados em uma história, solicitando à API Microsoft Copilot o retorno no formato Gherkin com palavras-chave no idioma desejado.

Parameters:

  • historia (String)

    Texto base da história para gerar os cenários.

  • idioma (String) (defaults to: 'pt')

    Código do idioma, ‘pt’ por padrão.

Returns:

  • (String, nil)

    Cenários no formato Gherkin, ou nil em caso de erro.



18
19
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
# File 'lib/bddgenx/ia/microsoft_copilot_cliente.rb', line 18

def self.gerar_cenarios(historia, idioma = 'pt')
  api_key = Bddgenx.configuration.microsoft_copilot_api_key  # para Copilot


  # Define as palavras-chave para os cenários BDD

  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"
  }

  # Escolhe o conjunto de palavras-chave conforme o idioma

  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  # Verifica se a chave de API foi configurada corretamente\n  unless api_key\n    warn \"\u274C API Key do Microsoft Copilot n\u00E3o encontrada no .env (MICROSOFT_COPILOT_API_KEY)\"\n    return nil\n  end\n\n  # Define o endpoint da API Microsoft Copilot\n  uri = URI(\"\#{MICROSOFT_COPILOT_API_URL}?key=\#{api_key}\")\n\n  # Estrutura do corpo da requisi\u00E7\u00E3o para a API Microsoft Copilot\n  request_body = {\n    contents: [\n      {\n        model: \"o4-mini\",\n        role: \"user\",\n        parts: [{ text: prompt_base }]\n      }\n    ]\n  }\n\n  # Executa requisi\u00E7\u00E3o POST para a API Microsoft Copilot\n  response = Net::HTTP.post(uri, request_body.to_json, { \"Content-Type\" => \"application/json\" })\n\n  # Verifica se a resposta foi bem-sucedida\n  if response.is_a?(Net::HTTPSuccess)\n    json = JSON.parse(response.body)\n\n    unless json[\"choices\"]&.is_a?(Array) && json[\"choices\"].any?\n      warn \"\u274C Resposta da IA sem candidatos v\u00E1lidos:\"\n      warn JSON.pretty_generate(json)\n      return nil\n    end\n\n    # Recupera o conte\u00FAdo gerado pela IA\n    texto_ia = json[\"choices\"].first.dig(\"message\", \"content\")\n\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      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.microsoft_copilot_error', code: response.code, body: response.body)\n    return nil\n  end\nend\n"