Class: Sage::ProcessReportJob

Inherits:
ActiveJob::Base
  • Object
show all
Includes:
ActionView::RecordIdentifier
Defined in:
app/jobs/sage/process_report_job.rb

Instance Method Summary collapse

Instance Method Details

#perform(prompt, query_id:, stream_target_id:) ⇒ Object



8
9
10
11
12
13
14
15
16
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
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
# File 'app/jobs/sage/process_report_job.rb', line 8

def perform(prompt, query_id:, stream_target_id:)
  query = Blazer::Query.find(query_id)

  # Ensure we have the proper routing context for broadcasts
  self.class.default_url_options = Rails.application.routes.default_url_options

  Turbo::StreamsChannel.broadcast_append_to(
    "messages",
    target: dom_id(query, "messages"),
    partial: "sage/queries/streaming_message",
    locals: { stream_target_id:, content: "Thinking..." }
  )

  # Use the ReportProcessor to handle the LLM interaction and parsing
  processor = ReportProcessor.new(
    query: query,
    prompt: prompt,
    stream_target_id: stream_target_id
  )

  result = processor.process
  Rails.logger.info "ProcessReportJob result: #{result.inspect}"
  summary = result[:summary]
  sql = result[:sql]

  Rails.logger.info "Summary: #{summary}"
  Rails.logger.info "SQL: #{sql}"
  # Handle empty summary
  summary = "I couldn't generate a response. Please try again." if summary.blank?

  ai_message = query.messages.create!(body: summary, statement: sql)

  Turbo::StreamsChannel.broadcast_replace_to(
    "messages",
    target: stream_target_id,
    partial: "sage/queries/message",
    locals: { message: ai_message, stream_target_id: stream_target_id }
  )

  Turbo::StreamsChannel.broadcast_replace_to(
    "statements",
    target: dom_id(query, "statement-box"),
    partial: "sage/queries/statement_box",
    locals: { query: query, statement: sql, form_url: run_queries_path }
  )

  # Auto-submit the form after the statement_box renders
  Turbo::StreamsChannel.broadcast_append_to(
    "statements",
    target: "body",
    html: "<script>
      setTimeout(() => {
        // Wait for ACE editor to be fully initialized
        const checkAndSubmit = () => {
          const form = document.querySelector('##{dom_id(query, "statement-box")} form');
          const hiddenField = document.querySelector('#query_statement');

          if (form && hiddenField && hiddenField.value && window.aceEditor) {
            form.submit();
          } else {
            // Retry after another 100ms if not ready
            setTimeout(checkAndSubmit, 100);
          }
        };
        checkAndSubmit();
      }, 200);
    </script>"
  )

  true
end