Module: CollavreOpenclaw::AiClientExtension

Extended by:
ActiveSupport::Concern
Defined in:
app/services/collavre_openclaw/ai_client_extension.rb

Instance Method Summary collapse

Instance Method Details

#chat(messages_input, tools: [], &block) ⇒ Object

Parameters:

  • messages_input (Hash, Array)

    Hash { messages:, first_message:, context_changed:, system_prompt: } from SessionContextResolver, or a plain Array from standalone callers (e.g., CompressJob).



17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
# File 'app/services/collavre_openclaw/ai_client_extension.rb', line 17

def chat(messages_input, tools: [], &block)
  normalized_vendor = vendor.to_s.downcase
  messages_data = normalize_messages_input(messages_input)

  # Check if we have a custom adapter for this vendor
  adapter_class = self.class.adapter_registry[normalized_vendor]

  if adapter_class
    # Use the custom adapter (tools not supported for OpenClaw)
    # Prefer resolved system_prompt from SessionContextResolver over instance default.
    # key?(:system_prompt) distinguishes "not provided" (Array input) from "explicitly nil" (incremental session).
    resolved_system_prompt = messages_data.key?(:system_prompt) ? messages_data[:system_prompt] : system_prompt
    user = context&.dig(:user)
    adapter = adapter_class.new(
      user: user,
      system_prompt: resolved_system_prompt,
      context: context
    )

    response_content = nil
    error_message = nil

    begin
      response_content = adapter.chat(messages_data, &block)
    rescue StandardError => e
      error_message = e.message
      raise
    ensure
      log_interaction(
        messages: messages_data[:messages],
        tools: [],
        response_content: response_content,
        error_message: error_message,
        input_tokens: nil,
        output_tokens: nil
      )
    end

    return response_content
  end

  # Fall back to original RubyLLM implementation (expects Array)
  super(messages_data[:messages], tools: tools, &block)
end