# enterprise/lib/captain/tools/scenario_delegator_tool.rb module Captain::Tools class ScenarioDelegatorTool < Captain::Tools::BasePublicTool attr_reader :scenario def initialize(scenario, user: nil, conversation: nil) @scenario = scenario super(@scenario.assistant, user: user, conversation: conversation) end def name "consultar_#{@scenario.title.parameterize.underscore}" end def description "Consulta o departamento especializado: #{@scenario.description}. Use esta ferramenta para obter informações ou realizar ações sobre este assunto." end param :pergunta_interna, type: 'string', desc: 'A pergunta ou instrução detalhada que você quer enviar para este departamento.' def perform(_tool_context, pergunta_interna:) # Instanciamos o agente do cenário, que já carrega suas próprias ferramentas (custom tools, etc) agent = @scenario.agent(user: @user, conversation: @conversation) # Usamos o Runner padrão (Agents gem) para permitir o loop de Pensamento/Ação # Isso permite que este sub-agente decida se precisa chamar ferramentas ou apenas responder Rails.logger.info "[ScenarioDelegatorTool] Iniciando sub-agente: #{@scenario.title}" Rails.logger.info "[ScenarioDelegatorTool] Ferramentas do Agente (#{@scenario.title}): #{agent.tools.map(&:name)}" runner = Agents::Runner.with_agents(agent) result = runner.run(pergunta_interna, max_turns: 10) Rails.logger.info "[ScenarioDelegatorTool] Sub-agente (#{@scenario.title}) finished. Output: #{result.output.inspect}" if result.failed? || result.output.nil? Rails.logger.info "[ScenarioDelegatorTool] Falha no sub-agente (#{@scenario.title}):" # Agents::RunResult names: failed?, error, messages Rails.logger.info " - Error: #{result.error}" Rails.logger.info " - Last Messages: #{result.messages.last(3).map { |m| m.slice(:role, :content, :tool_calls) }.inspect}" return "O departamento #{@scenario.title} encontrou um erro: #{result.error || 'sem resposta clara'}." end result.output.is_a?(Hash) ? (result.output['response'] || result.output.to_s) : result.output.to_s rescue StandardError => e Rails.logger.error "[ScenarioDelegatorTool] ERRO CRÍTICO no sub-agente #{@scenario.title}: #{e.message}\n#{e.backtrace.first(10).join("\n")}" "Erro técnico ao consultar o departamento #{@scenario.title}: #{e.message}" end end end