Class: GithubDailyDigest::GeminiService

Inherits:
Object
  • Object
show all
Defined in:
lib/gemini_service.rb

Constant Summary collapse

DEFAULT_MODEL =

Default model - will be overridden by configuration

'gemini-2.5-flash-preview-04-17'
EXPECTED_KEYS =

Keys expected in the Gemini JSON response

%w[projects changes contribution_weights pr_count summary lines_changed].freeze

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(api_key:, logger:, config:, github_graphql_service:) ⇒ GeminiService

Returns a new instance of GeminiService.



15
16
17
18
19
20
21
22
23
24
25
# File 'lib/gemini_service.rb', line 15

def initialize(api_key:, logger:, config:, github_graphql_service:)
  @logger = logger
  @config = config
  @github_graphql_service = github_graphql_service
  @model = config.gemini_model || DEFAULT_MODEL
  
  initialize_client(api_key, @model)
rescue => e
  @logger.fatal("Failed to initialize Gemini client: #{e.message}")
  raise
end

Instance Attribute Details

#client ⇒ Object (readonly)

Returns the value of attribute client.



13
14
15
# File 'lib/gemini_service.rb', line 13

def client
  @client
end

Instance Method Details

#analyze_activity(username:, commits_with_code:, review_count:, time_window_days:) ⇒ Object



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
# File 'lib/gemini_service.rb', line 41

def analyze_activity(username:, commits_with_code:, review_count:, time_window_days:)
  # If there are no commits and no reviews, return empty data
  if commits_with_code.empty? && review_count == 0
    @logger.info("No activity found for #{username} to analyze.")
    return default_no_activity_report
  else
    @logger.debug("Found activity for #{username}: #{commits_with_code.size} commits in repositories: #{commits_with_code.map { |c| c[:repo] }.uniq.join(', ')}")
  end

  
  # Make multiple attempts to analyze with Gemini, handle errors gracefully
  begin
    prompt = build_prompt(username, commits_with_code, review_count, time_window_days)
    # @logger.debug("Gemini Prompt for #{username}:\n#{prompt}") # Uncomment for debugging prompts

    response_text = execute_gemini_request(prompt, username)
    @logger.debug("Gemini response for #{username}: #{response_text}")
    
    if response_text
      return parse_and_validate_response(response_text, username)
    else
      # Failure occurred within execute_gemini_request (already logged)
      @logger.warn("Gemini analysis failed for #{username}, using fallback analysis.")
      return create_fallback_analysis(username, commits_with_code, review_count)
    end
  rescue => e
    @logger.error("Unexpected error analyzing #{username}'s activity: #{e.message}")
    @logger.warn("Using fallback analysis due to error.")
    return create_fallback_analysis(username, commits_with_code, review_count)
  end
end

#initialize_client(api_key, model) ⇒ Object



27
28
29
30
31
32
33
34
35
36
37
38
39
# File 'lib/gemini_service.rb', line 27

def initialize_client(api_key, model)
  @logger.info("Initializing Gemini client with model: #{model}")
  
  @client = Gemini.new(
    credentials: {
      service: 'generative-language-api',  
      api_key: api_key
    },
    options: { 
      model: model
    }
  )
end