diff --git a/enterprise/app/errors/captain/errors/system_prompt_leak_error.rb b/enterprise/app/errors/captain/errors/system_prompt_leak_error.rb index 43cd875b2..c0c68a51e 100644 --- a/enterprise/app/errors/captain/errors/system_prompt_leak_error.rb +++ b/enterprise/app/errors/captain/errors/system_prompt_leak_error.rb @@ -1,3 +1 @@ -# frozen_string_literal: true - class Captain::Errors::SystemPromptLeakError < StandardError; end diff --git a/enterprise/app/models/concerns/agentable.rb b/enterprise/app/models/concerns/agentable.rb index 6793dde22..2ee0f3ad9 100644 --- a/enterprise/app/models/concerns/agentable.rb +++ b/enterprise/app/models/concerns/agentable.rb @@ -35,6 +35,10 @@ module Concerns::Agentable end end + def default_orchestrator_prompt + Captain::PromptRenderer.read_template(template_name) + end + private def agent_name diff --git a/enterprise/app/views/api/v1/models/captain/_assistant.json.jbuilder b/enterprise/app/views/api/v1/models/captain/_assistant.json.jbuilder index 9f14342ad..f17041e1f 100644 --- a/enterprise/app/views/api/v1/models/captain/_assistant.json.jbuilder +++ b/enterprise/app/views/api/v1/models/captain/_assistant.json.jbuilder @@ -1,7 +1,7 @@ json.account_id resource.account_id json.config resource.config json.created_at resource.created_at.to_i -json.default_orchestrator_prompt Captain::PromptRenderer.load_template('assistant') +json.default_orchestrator_prompt Captain::PromptRenderer.read_template('assistant') json.description resource.description json.guardrails resource.guardrails json.id resource.id diff --git a/enterprise/lib/captain/prompt_renderer.rb b/enterprise/lib/captain/prompt_renderer.rb index 77006f97a..12e6081d0 100644 --- a/enterprise/lib/captain/prompt_renderer.rb +++ b/enterprise/lib/captain/prompt_renderer.rb @@ -3,7 +3,7 @@ require 'liquid' class Captain::PromptRenderer class << self def render(template_name, context = {}) - template = load_template(template_name) + template = read_template(template_name) render_string(template, context) end @@ -12,7 +12,7 @@ class Captain::PromptRenderer liquid_template.render(stringify_keys(context)) end - def load_template(template_name) + def read_template(template_name) template_path = Rails.root.join('enterprise', 'lib', 'captain', 'prompts', "#{template_name}.liquid") raise "Template not found: #{template_name}" unless File.exist?(template_path) diff --git a/progresso/2026-02-27-orchestrator-prompt-editor.md b/progresso/2026-02-27-orchestrator-prompt-editor.md new file mode 100644 index 000000000..4b00c6971 --- /dev/null +++ b/progresso/2026-02-27-orchestrator-prompt-editor.md @@ -0,0 +1,26 @@ +# Nota de Resolução - Editor de Prompt do Orquestrador + +**Objetivo:** Permitir a edição do prompt do orquestrador do Capitão IA via interface administrativa. + +**Contexto:** Anteriormente, o prompt era fixo no arquivo `.liquid`, exigindo novos builds para qualquer alteração. + +**Passos realizados:** +1. Criada migração para adicionar `orchestrator_prompt` em `captain_assistants`. +2. Refatorado `Captain::PromptRenderer` para permitir a leitura de templates padrão. +3. Implementado `Agentable#default_orchestrator_prompt` e lógica de priorização no backend. +4. Criado componente Vue `OrchestratorPromptEditor` com validações e funcionalidade de reset. +5. Integrado o componente na tela de configurações do assistente. + +**Arquivos principais alterados:** +- `enterprise/app/models/concerns/agentable.rb` +- `enterprise/lib/captain/prompt_renderer.rb` +- `app/javascript/dashboard/routes/dashboard/captain/assistants/settings/Settings.vue` +- `app/javascript/dashboard/components-next/captain/pageComponents/assistant/settings/OrchestratorPromptEditor.vue` + +**Como validar:** +- Acessar configurações do assistente -> Prompt do Orquestrador. +- Alterar o texto, salvar e verificar se persiste. +- Resetar para o padrão e verificar se o texto original retorna. + +**Como reverter:** +- Remover a coluna `orchestrator_prompt` do banco de dados e apagar o componente Vue.