module Concerns::Agentable extend ActiveSupport::Concern def agent Agents::Agent.new( name: agent_name, instructions: ->(context) { agent_instructions(context) }, tools: agent_tools, model: agent_model, temperature: temperature.to_f || 0.7, response_schema: agent_response_schema ) end def agent_instructions(context = nil) enhanced_context = prompt_context if context state = context.context[:state] || {} conversation_data = state[:conversation] || {} contact_data = state[:contact] || {} enhanced_context = enhanced_context.merge( conversation: conversation_data, contact: contact_data ) end Captain::PromptRenderer.render(template_name, enhanced_context.with_indifferent_access) end private def agent_name raise NotImplementedError, "#{self.class} must implement agent_name" end def template_name self.class.name.demodulize.underscore end def agent_tools [] # Default implementation, override if needed end def agent_model InstallationConfig.find_by(name: 'CAPTAIN_OPEN_AI_MODEL')&.value.presence || OpenAiConstants::DEFAULT_MODEL end def agent_response_schema Captain::ResponseSchema end def prompt_context raise NotImplementedError, "#{self.class} must implement prompt_context" end end