Class: Assistant::TechnicalSupport::CaseReplay

Inherits:
Object
  • Object
show all
Includes:
Service
Defined in:
app/services/assistant/technical_support/case_replay.rb,
app/services/assistant/technical_support/case_replay/result.rb,
app/services/assistant/technical_support/case_replay/episode.rb,
app/services/assistant/technical_support/case_replay/tool_call.rb,
app/services/assistant/technical_support/case_replay/assessment.rb,
app/services/assistant/technical_support/case_replay/system_prompt_turn.rb,
app/services/assistant/technical_support/case_replay/article_review_proposal.rb

Overview

Value objects used when replaying a technical support case.

Defined Under Namespace

Classes: ArticleReviewProposal, Assessment, Episode, Result, SystemPromptTurn, ToolCall

Constant Summary collapse

TOOL_SERVICES =
%w[content product_catalog].freeze
EMPTY_RESULT_LIST =
[].freeze
RESULT_DEFAULT_ATTRIBUTES =
{
  support_case_id: nil,
  case_number: nil,
  conversation_id: nil,
  episode: nil,
  assessment: nil,
  citation_urls: EMPTY_RESULT_LIST,
  citations_grounded: false,
  article_review_proposals: EMPTY_RESULT_LIST,
  evidence_coverage: EMPTY_RESULT_LIST,
  evidence_blockers: EMPTY_RESULT_LIST,
  evidence_event_count: 0,
  evidence_chars: 0,
  error: nil
}.freeze

Instance Method Summary collapse

Methods included from Service

#attributes_used, #build_result, call, #logger

Methods included from Service::Initializer

#initialize

Instance Method Details

#callResult

Returns:



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
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
# File 'app/services/assistant/technical_support/case_replay.rb', line 28

def call
  preparation = CaseReplayPreparation.call(
    support_case:,
    account:,
    analyzer:,
    event_stream_builder:
  )
  if preparation.error
    return skipped(
      preparation.error,
      episode: preparation.episode,
      stream: preparation.stream
    )
  end

  conversation = CaseReplayConversation.call(
    chat_runner:,
    account:,
    support_case:,
    episode: preparation.episode,
    events: preparation.events,
    tool_services: TOOL_SERVICES
  )
  result = CaseReplayResultBuilder.call(
    support_case:,
    episode: preparation.episode,
    stream: preparation.stream,
    conversation:,
    analyzer:
  )
  result_persister.call(
    conversation_id: conversation.conversation_id,
    support_case_id: support_case.id,
    result:,
    answer: conversation.answer,
    tool_trace: conversation.tool_trace,
    system_prompt_trace: conversation.system_prompt_trace
  )
  result
rescue CaseReplayPersistence::PersistenceError => e
  ErrorReporting.error(
    e,
    feature: 'technical_support_case_replay_persistence',
    support_case_id: support_case&.id,
    assistant_conversation_id: conversation&.conversation_id
  )
  failed(
    "Replay result could not be persisted: #{e.message}",
    stream: preparation&.stream,
    conversation_id: conversation&.conversation_id
  )
rescue CaseReplayRunner::BlankResponse => e
  Rails.logger.warn(
    "[Assistant::TechnicalSupport::CaseReplay] case_id=#{support_case&.id} failed: #{e.message}"
  )
  failed(e.message, stream: preparation&.stream)
rescue StandardError => e
  ErrorReporting.error(
    e,
    feature: 'technical_support_case_replay',
    support_case_id: support_case&.id
  )
  Rails.logger.warn(
    "[Assistant::TechnicalSupport::CaseReplay] case_id=#{support_case&.id} failed with #{e.class}"
  )
  failed("Replay failed with #{e.class}.", stream: preparation&.stream)
end