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)
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..." }
)
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}"
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 }
)
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
|