47 lines
2.0 KiB
Ruby
47 lines
2.0 KiB
Ruby
# enterprise/lib/captain/tools/scenario_delegator_tool.rb
|
|
module Captain::Tools
|
|
class ScenarioDelegatorTool < Captain::Tools::BasePublicTool
|
|
attr_reader :scenario
|
|
|
|
def initialize(scenario)
|
|
@scenario = scenario
|
|
super(@scenario.assistant)
|
|
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
|
|
|
|
# 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}"
|
|
|
|
# Log steps to debug why tool might not have been called
|
|
Rails.logger.info "[ScenarioDelegatorTool] Thoughts: #{result.thoughts.inspect}" if result.respond_to?(:thoughts)
|
|
|
|
# Extraímos a resposta final (mesma lógica do AgentRunnerService)
|
|
result.output['response'] || result.output.to_s
|
|
rescue StandardError => e
|
|
Rails.logger.error "[ScenarioDelegatorTool] Erro no sub-agente #{@scenario.title}: #{e.message}"
|
|
"Erro ao consultar o departamento #{@scenario.title}: #{e.message}"
|
|
end
|
|
end
|
|
end
|