From 975a4be7e45ce2a2918aacd76315d91b0a26e4c3 Mon Sep 17 00:00:00 2001 From: Rodrigo Borba Date: Thu, 15 Jan 2026 17:24:28 -0300 Subject: [PATCH] =?UTF-8?q?refatorar:=20Unificar=20a=20resolu=C3=A7=C3=A3o?= =?UTF-8?q?=20de=20contexto=20para=20ferramentas=20e=20mover=20a=20l=C3=B3?= =?UTF-8?q?gica=20do=20r=C3=B3tulo=20'desligar=5Fia'=20do=20contato=20para?= =?UTF-8?q?=20a=20conversa.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../services/captain/llm/assistant_chat_service.rb | 1 - enterprise/app/services/captain/llm/jasmine_brain.rb | 2 +- enterprise/app/services/captain/tools/base_tool.rb | 10 ++++++++++ .../lib/captain/tools/add_contact_note_tool.rb | 2 +- .../captain/tools/add_label_to_conversation_tool.rb | 2 +- .../lib/captain/tools/add_private_note_tool.rb | 2 +- enterprise/lib/captain/tools/base_public_tool.rb | 12 ++++++++++++ enterprise/lib/captain/tools/update_priority_tool.rb | 2 +- 8 files changed, 27 insertions(+), 6 deletions(-) diff --git a/enterprise/app/services/captain/llm/assistant_chat_service.rb b/enterprise/app/services/captain/llm/assistant_chat_service.rb index 3464e78..98b51f7 100755 --- a/enterprise/app/services/captain/llm/assistant_chat_service.rb +++ b/enterprise/app/services/captain/llm/assistant_chat_service.rb @@ -100,7 +100,6 @@ class Captain::Llm::AssistantChatService < Llm::BaseAiService def handle_tool_side_effects(tool_key, conversation) return unless tool_key == 'escalar_humano' - conversation.contact.add_labels(['desligar_ia']) conversation.add_labels(['desligar_ia']) conversation.custom_attributes['ai_disabled'] = true conversation.save! diff --git a/enterprise/app/services/captain/llm/jasmine_brain.rb b/enterprise/app/services/captain/llm/jasmine_brain.rb index f404d08..53798ed 100644 --- a/enterprise/app/services/captain/llm/jasmine_brain.rb +++ b/enterprise/app/services/captain/llm/jasmine_brain.rb @@ -39,7 +39,7 @@ module Captain private def contact_has_disabled_label? - @contact.labels.exists?(name: 'desligar_ia') + @conversation.labels.exists?(name: 'desligar_ia') rescue StandardError false end diff --git a/enterprise/app/services/captain/tools/base_tool.rb b/enterprise/app/services/captain/tools/base_tool.rb index 55f43a7..b22ac18 100755 --- a/enterprise/app/services/captain/tools/base_tool.rb +++ b/enterprise/app/services/captain/tools/base_tool.rb @@ -25,6 +25,16 @@ class Captain::Tools::BaseTool < RubyLLM::Tool actual_params.with_indifferent_access end + def resolve_context(tool_context) + if tool_context.respond_to?(:state) + tool_context.state + elsif tool_context.is_a?(Hash) + tool_context + else + {} + end.with_indifferent_access + end + def active? true end diff --git a/enterprise/lib/captain/tools/add_contact_note_tool.rb b/enterprise/lib/captain/tools/add_contact_note_tool.rb index 7a74d21..c599fdf 100755 --- a/enterprise/lib/captain/tools/add_contact_note_tool.rb +++ b/enterprise/lib/captain/tools/add_contact_note_tool.rb @@ -4,7 +4,7 @@ class Captain::Tools::AddContactNoteTool < Captain::Tools::BasePublicTool def perform(tool_context, args = {}) note = args[:note] || args['note'] - contact = find_contact(tool_context.state) + contact = find_contact(resolve_context(tool_context)) return 'Contact not found' unless contact return 'Note content is required' if note.blank? diff --git a/enterprise/lib/captain/tools/add_label_to_conversation_tool.rb b/enterprise/lib/captain/tools/add_label_to_conversation_tool.rb index 07f0a7a..8b1fcf4 100755 --- a/enterprise/lib/captain/tools/add_label_to_conversation_tool.rb +++ b/enterprise/lib/captain/tools/add_label_to_conversation_tool.rb @@ -4,7 +4,7 @@ class Captain::Tools::AddLabelToConversationTool < Captain::Tools::BasePublicToo def perform(tool_context, args = {}) label_name = args[:label_name] || args['label_name'] - conversation = find_conversation(tool_context.state) + conversation = find_conversation(resolve_context(tool_context)) return 'Conversation not found' unless conversation label_name = label_name&.strip&.downcase diff --git a/enterprise/lib/captain/tools/add_private_note_tool.rb b/enterprise/lib/captain/tools/add_private_note_tool.rb index 4281def..e8453ed 100755 --- a/enterprise/lib/captain/tools/add_private_note_tool.rb +++ b/enterprise/lib/captain/tools/add_private_note_tool.rb @@ -4,7 +4,7 @@ class Captain::Tools::AddPrivateNoteTool < Captain::Tools::BasePublicTool def perform(tool_context, args = {}) note = args[:note] || args['note'] - conversation = find_conversation(tool_context.state) + conversation = find_conversation(resolve_context(tool_context)) return 'Conversation not found' unless conversation return 'Note content is required' if note.blank? diff --git a/enterprise/lib/captain/tools/base_public_tool.rb b/enterprise/lib/captain/tools/base_public_tool.rb index 6bfdcad..b9d6503 100755 --- a/enterprise/lib/captain/tools/base_public_tool.rb +++ b/enterprise/lib/captain/tools/base_public_tool.rb @@ -39,6 +39,18 @@ class Captain::Tools::BasePublicTool < Agents::Tool end.with_indifferent_access end + def resolve_context(tool_context) + # Handle the case where tool_context is a Hash (Agents gem / Sub-agents) + # or an Object with a state reader (RubyLLM / Main Agent) + if tool_context.respond_to?(:state) + tool_context.state + elsif tool_context.is_a?(Hash) + tool_context + else + {} + end.with_indifferent_access + end + private def account_scoped(model_class) diff --git a/enterprise/lib/captain/tools/update_priority_tool.rb b/enterprise/lib/captain/tools/update_priority_tool.rb index dc0c752..0e7061d 100755 --- a/enterprise/lib/captain/tools/update_priority_tool.rb +++ b/enterprise/lib/captain/tools/update_priority_tool.rb @@ -4,7 +4,7 @@ class Captain::Tools::UpdatePriorityTool < Captain::Tools::BasePublicTool def perform(tool_context, args = {}) priority = args[:priority] || args['priority'] - @conversation = find_conversation(tool_context.state) + @conversation = find_conversation(resolve_context(tool_context)) return 'Conversation not found' unless @conversation @normalized_priority = normalize_priority(priority)