• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

Origen-SDK / origen / 22262978015

21 Feb 2026 07:33PM UTC coverage: 75.017% (+0.07%) from 74.944%
22262978015

push

github

Priyavadan Kumar
Add Error Assistant LLM integration

- Integrated OrigenLlm::ErrorAssistant for AI-powered error analysis
- Added site config options for LLM provider configuration
- Supports generic and Anthropic Claude API backends
- Privacy-by-default: disabled unless explicitly configured
- Best-effort timeout handling (default 3s)
- Comprehensive test coverage

56 of 66 new or added lines in 1 file covered. (84.85%)

6732 of 8974 relevant lines covered (75.02%)

7305.7 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

84.85
/lib/origen/error_assistant.rb
1
require 'timeout'
8✔
2

3
module Origen
8✔
4
  module ErrorAssistant
8✔
5
    module_function
8✔
6

7
    DEFAULT_TIMEOUT_SECONDS = 3.0
8✔
8
    DEFAULT_SITE_MODE = 'off'
8✔
9
    DEFAULT_PROMPT_MODE = 'default'
8✔
10
    DEFAULT_DISPLAY_NAME = 'Error Assistant'
8✔
11
    VALID_SITE_MODES = %w(off opt_in forced).freeze
8✔
12
    VALID_PROMPT_MODES = %w(default site_template backend_profile).freeze
8✔
13

14
    def site_mode
8✔
15
      raw = Origen.site_config.error_assistant_mode.to_s.strip.downcase
48✔
16
      VALID_SITE_MODES.include?(raw) ? raw : DEFAULT_SITE_MODE
48✔
17
    rescue
NEW
18
      DEFAULT_SITE_MODE
×
19
    end
20

21
    def app_enable_value
8✔
22
      return nil unless Origen.app_loaded?
16✔
23
      return nil unless Origen.app.respond_to?(:error_assistant_enable)
16✔
24

25
      Origen.app.error_assistant_enable
16✔
26
    rescue
NEW
27
      nil
×
28
    end
29

30
    def enabled?
8✔
31
      case site_mode
48✔
32
      when 'off'
33
        false
8✔
34
      when 'forced'
35
        true
24✔
36
      when 'opt_in'
37
        app_enable_value == true
16✔
38
      else
NEW
39
        false
×
40
      end
41
    end
42

43
    def timeout_seconds
8✔
44
      raw = Origen.site_config.error_assistant_timeout_seconds
40✔
45
      val = raw.nil? ? DEFAULT_TIMEOUT_SECONDS : raw.to_f
40✔
46
      val.positive? ? val : DEFAULT_TIMEOUT_SECONDS
40✔
47
    rescue
NEW
48
      DEFAULT_TIMEOUT_SECONDS
×
49
    end
50

51
    def warning_enabled?
8✔
52
      val = Origen.site_config.error_assistant_warning_enable
8✔
53
      val.nil? ? true : val == true
8✔
54
    rescue
NEW
55
      true
×
56
    end
57

58
    def prompt_mode
8✔
59
      raw = Origen.site_config.error_assistant_prompt_mode.to_s.strip.downcase
16✔
60
      VALID_PROMPT_MODES.include?(raw) ? raw : DEFAULT_PROMPT_MODE
16✔
61
    rescue
NEW
62
      DEFAULT_PROMPT_MODE
×
63
    end
64

65
    def display_name
8✔
66
      val = Origen.site_config.error_assistant_friendly_name
24✔
67
      v = val.to_s.strip
24✔
68
      v.empty? ? DEFAULT_DISPLAY_NAME : v
24✔
69
    rescue
NEW
70
      DEFAULT_DISPLAY_NAME
×
71
    end
72

73
    def provider_available?
8✔
74
      ensure_provider_loaded
16✔
75
      defined?(::OrigenLlm::ErrorAssistant) && ::OrigenLlm::ErrorAssistant.respond_to?(:analyze)
16✔
76
    end
77

78
    def analyze(exception_message:, app_stack:, app_root:)
8✔
79
      return nil unless enabled?
16✔
80
      return nil unless provider_available?
16✔
81

82
      context = {
83
        app_root:         app_root.to_s,
16✔
84
        timeout_seconds:  timeout_seconds,
85
        provider_mode:    Origen.site_config.error_assistant_provider_mode,
86
        model:            Origen.site_config.error_assistant_model,
87
        max_tokens:       Origen.site_config.error_assistant_max_tokens,
88
        temperature:      Origen.site_config.error_assistant_temperature,
89
        api_url:          Origen.site_config.error_assistant_api_url,
90
        api_key_env:      Origen.site_config.error_assistant_api_key_env,
91
        auth_mode:        Origen.site_config.error_assistant_auth_mode,
92
        auth_header_name: Origen.site_config.error_assistant_auth_header_name,
93
        auth_prefix:      Origen.site_config.error_assistant_auth_prefix,
94
        extra_headers:    Origen.site_config.error_assistant_extra_headers,
95
        prompt_mode:      prompt_mode,
96
        prompt_template:  Origen.site_config.error_assistant_prompt_template,
97
        backend_profile:  Origen.site_config.error_assistant_backend_profile,
98
        backend_context:  Origen.site_config.error_assistant_backend_context
99
      }
100

101
      result = Timeout.timeout(timeout_seconds) do
16✔
102
        ::OrigenLlm::ErrorAssistant.analyze(
16✔
103
          exception_message: exception_message,
104
          app_stack:         app_stack,
105
          context:           context
106
        )
107
      end
108

109
      result.is_a?(String) && !result.strip.empty? ? result.strip : nil
8✔
110
    rescue Timeout::Error
111
      warn("#{display_name} timed out after #{timeout_seconds}s")
8✔
112
      nil
8✔
113
    rescue => e
NEW
114
      warn("#{display_name} failed: #{e.class}: #{e.message}")
×
NEW
115
      nil
×
116
    end
117

118
    def warn(message)
8✔
119
      Origen.log.warn(message) if warning_enabled?
8✔
120
    end
121
    private_class_method :warn
8✔
122

123
    def ensure_provider_loaded
8✔
124
      return if @provider_load_attempted
16✔
125

126
      @provider_load_attempted = true
16✔
127
      require 'origen_llm'
16✔
128
    rescue LoadError
NEW
129
      nil
×
130
    end
131
    private_class_method :ensure_provider_loaded
8✔
132
  end
133
end
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc